2016-08-03 58 views
0

如果我定义在C++ 98方案如下:预移位器会评估位移和算术运算吗?

#define BITS_PER_FOO 2 
#define BITS_PER_BAR 3 
#define FOOBARS (1<<(BITS_PER_FOO*BITS_PER_BAR)) 

然后将FOOBARS得到由预编译评价为64?或者,我将在代码中使用FOOBARS的每个位置进行乘法和位移操作?

+0

您的意思是预处理器?预处理器只是用'(1 <<(2 * 3))'替换'FOOBARS'。编译器然后在编译时将此表达式优化为64。 – DaBler

回答

0

乘法和位移操作将发生在您使用FOOBARS的每个位置。

参见:#define Directive (C/C++)

#define形式的宏,这意味着该标识符替换为在令牌字符串的一切。在你的情况下,预处理器用(1<<(BITS_PER_FOO*BITS_PER_BAR))

2

替换FOOBARS的实例否,因为它不是预处理器的业务。它做通常的替代物品,而不是经常折叠。

但是,任何合理的编译器都会进行不断的折叠,因此您不应该期望它与运行时正在执行的指令相对应。

2

预编译器只是进行文本替换 - 它本质上是拷贝&粘贴在类固醇上。这意味着您为FOOBAR编写的表达式将在每个替换位置完整展开。

现在,任何体面的编译器都会在编译时评估整个子表达式。然而,你可以保存它的一些工作(并且有一些额外的优点,比如有一个明确的表达类型,更明确的诊断,从错误位置替换得到的更少的意外,并且对于常量而不是表达式有一个实际的左值)将这些值定义为实际常数,如:

const int bits_per_foo = 2; 
const int bits_per_bar = 3; 
const int foobars = 1<<(bits_per_foo*bits_per_bar);