#if指令求值顺序:宏展开与defined关键字的执行优先级
C预处理器
#if/#elif指令处理顺序相关问题 结论
你观测到的GCC处理行为属于未定义行为,C标准既没有强制规定该场景下的处理规则,也不要求编译器针对这种情况给出诊断提示。
具体依据
C99标准6.10.1节第3条有明确约束:
defined一元运算符仅允许出现在#if或#elif指令的控制表达式中,不能出现在宏的参数列表内,也不允许出现在宏展开后的结果里,违反该要求的行为属于未定义行为。
你提到的两种场景的表现也符合上述约束的边界:
- 对于
defined MACRO的写法,defined是预处理器原生识别的运算符,不会被当作普通宏处理,会优先完成标识符是否定义的判定,属于合法的标准写法 - 对于
MACRO(defined ID)的写法,defined出现在宏参数的位置,预处理器会先完成宏展开操作,此时defined已经属于宏展开后的产物,触发了标准约束的未定义场景
GCC当前的处理只是主流编译器的常见选择,没有任何标准层面的强制约束力,其他编译器完全可以采用不同的处理逻辑,不属于标准不合规。
内容的提问来源于stack exchange,提问作者koorkevani
相关产品推荐
相关产品推荐

