【发布时间】:2021-11-21 18:00:16
【问题描述】:
当 c 预处理器运行 #if/#elif 预处理指令时,它会对直接跟随的标记执行 4 次操作:
- 如果定义了
{identifier},则将每次出现的defined {identifier}替换为1,否则将0。 - 调用所有宏。
- 用
0替换所有剩余的标识符。 - 将结果解析并评估为
constant-expression。
现在,从标准 (c99, 6.10.1) 中可以清楚地看出,第 3 步和第 4 步实际上是按此顺序发生的,并且在第 1 步和第 2 步完成之后。但我找不到任何关于 1 和 2 顺序的说明。
根据我所做的一些有限测试,gcc 似乎根据令牌的顺序执行步骤 1 和 2 - 在 defined MACRO 中,defined 首先执行,但在 MACRO(defined ID) 中宏执行。
标准是否要求这种行为?实现定义?未定义?
【问题讨论】:
标签: c language-lawyer c-preprocessor standards c99