如果我的头文件中有以下代码段:
#define banana 4
#define orange 2
#define fruit banana|orange
编译器是否足够聪明,只要在任何地方使用6" fruit"出现在程序中?
我假设是这样,但我讨厌假设。它是愚蠢的,它每次都会在2个常数之间执行布尔OR。如果是这样,与其他运营商同上如意?例如香蕉*橙等
答案 0 :(得分:1)
#define
行是执行文本替换的指令。这是编译的一个单独阶段,称为预处理。该名称应该暗示它在正常处理之前发生。
编译器在早期阶段以文本方式将#define
d名称替换为其定义。在您的示例中,它将banana
替换为2
,orange
替换为4
,fruit
替换为banana|orange
,然后替换为2|4
。对于编译的其余部分,它只看到2|4
,并且与任何其他常量表达式完全一样处理它。
编译是否足够聪明以智能地处理常量表达式?好吧,编译器在过去的50年里一直存在,并且他们一直处理这样的常量表达式。请放心,他们非常了解constant folding。如果你怀疑它,你可以随时查看生成的汇编语言。