如果我定义在C++ 98方案如下:预移位器会评估位移和算术运算吗?
#define BITS_PER_FOO 2
#define BITS_PER_BAR 3
#define FOOBARS (1<<(BITS_PER_FOO*BITS_PER_BAR))
然后将FOOBARS
得到由预编译评价为64?或者,我将在代码中使用FOOBARS
的每个位置进行乘法和位移操作?
如果我定义在C++ 98方案如下:预移位器会评估位移和算术运算吗?
#define BITS_PER_FOO 2
#define BITS_PER_BAR 3
#define FOOBARS (1<<(BITS_PER_FOO*BITS_PER_BAR))
然后将FOOBARS
得到由预编译评价为64?或者,我将在代码中使用FOOBARS
的每个位置进行乘法和位移操作?
乘法和位移操作将发生在您使用FOOBARS
的每个位置。
#define
形式的宏,这意味着该标识符替换为在令牌字符串的一切。在你的情况下,预处理器用(1<<(BITS_PER_FOO*BITS_PER_BAR))
替换FOOBARS
的实例否,因为它不是预处理器的业务。它做通常的替代物品,而不是经常折叠。
但是,任何合理的编译器都会进行不断的折叠,因此您不应该期望它与运行时正在执行的指令相对应。
预编译器只是进行文本替换 - 它本质上是拷贝&粘贴在类固醇上。这意味着您为FOOBAR
编写的表达式将在每个替换位置完整展开。
现在,任何体面的编译器都会在编译时评估整个子表达式。然而,你可以保存它的一些工作(并且有一些额外的优点,比如有一个明确的表达类型,更明确的诊断,从错误位置替换得到的更少的意外,并且对于常量而不是表达式有一个实际的左值)将这些值定义为实际常数,如:
const int bits_per_foo = 2;
const int bits_per_bar = 3;
const int foobars = 1<<(bits_per_foo*bits_per_bar);
您的意思是预处理器?预处理器只是用'(1 <<(2 * 3))'替换'FOOBARS'。编译器然后在编译时将此表达式优化为64。 – DaBler