我想了解如何按位运算由C/C++编译器处理。 具体来说,我说的是用gcc编译的C,但我相信这个问题比这个更普遍一些。在C/C++编译时按位运算
无论如何,假设我有一个定义的宏如下:
#define SOME_CONSTANT 0x111UL
#define SOME_OFFSET 2
#define SOME_MASK 7
#define SOME_VALUE ((SOME_CONSTANT) << (SOME_OFFSET)) & (SOME_MASK)
static inline void foo() { printf("Value: %lu#n", SOME_VALUE); }
所有SOME_VALUE的成分是常数,它们是在编译时已知的所有。
所以我的问题是:gcc会在编译时评估SOME_VALUE,还是只会在运行时完成? 如何检查gcc是否支持这种优化?
看看汇编语言输出(在gcc中有命令行选项 - '-S')。预处理器应该替换文本,因此编译器是否优化了剩余的内容。这应该。 – sje397 2015-04-02 07:59:49
这被称为“常量折叠”,您可以确信任何现代编译器都会在编译时执行此操作。 – Sneftel 2015-04-02 08:00:14
你可能想阅读§6。6(“常量表达式”)在ISO/IEC 9899:1999中解决了这个问题。或者[此概述](http://en.cppreference.com/w/c/language/constant_expression)。 – 2015-04-02 08:11:37