小编koo*_*ani的帖子

#if 指令中的求值顺序:宏扩展与“define”关键字

当 c 预处理器运行#if/#elif预处理指令时,它会对直接跟随的标记执行 4 个操作:

  1. 如果已定义,则将每次出现的 替换defined {identifier}为其他情况。1{identifier}0
  2. 调用所有宏。
  3. 将所有剩余的标识符替换为0
  4. 将结果解析并评估为constant-expression.

现在,从标准(c99,6.10.1)中可以很清楚地看出,步骤 3 和 4 实际上按该顺序发生,并且在步骤 1 和 2 完成之后。但我找不到关于1和2顺序的任何说明。

从我所做的一些有限测试来看,gcc 似乎根据标记的顺序执行步骤 1 和 2 - 在 中defined MACROdefined首先执行,但在MACRO(defined ID)宏中执行。

标准是否要求这种行为?实现定义的?不明确的?

c standards c99 language-lawyer c-preprocessor

3
推荐指数
1
解决办法
126
查看次数

标签 统计

c ×1

c-preprocessor ×1

c99 ×1

language-lawyer ×1

standards ×1