gcc如何处理定义使用其他定义的运算符

时间:2014-07-20 02:50:47

标签: gcc compilation

如果我的头文件中有以下代码段:

#define banana 4
#define orange 2

#define fruit banana|orange

编译器是否足够聪明,只要在任何地方使用6" fruit"出现在程序中?

我假设是这样,但我讨厌假设。它是愚蠢的,它每次都会在2个常数之间执行布尔OR。

如果是这样,与其他运营商同上如意?例如香蕉*橙等

1 个答案:

答案 0 :(得分:1)

#define行是执行文本替换的指令。这是编译的一个单独阶段,称为预处理。该名称应该暗示它在正常处理之前发生。

编译器在早期阶段以文本方式将#define d名称替换为其定义。在您的示例中,它将banana替换为2orange替换为4fruit替换为banana|orange,然后替换为2|4。对于编译的其余部分,它只看到2|4,并且与任何其他常量表达式完全一样处理它。

编译是否足够聪明以智能地处理常量表达式?好吧,编译器在过去的50年里一直存在,并且他们一直处理这样的常量表达式。请放心,他们非常了解constant folding。如果你怀疑它,你可以随时查看生成的汇编语言。