#include<stdio.h>
int main()
{
#if HELLO
printf("%d\n",1);
#endif
}
在此代码中,我期望在预处理器阶段出现
error
,因为 maco HELLO
未定义。但它不会产生任何错误,并且简单地忽略该 printf
语句。为什么这里 #if
指令充当 #ifdef
指令?
C 2018 6.10.1 4 表示
#if
指令中未定义为宏或与 defined
运算符一起使用的每个标识符都将替换为 0
:
…在执行完所有由于宏扩展和
一元运算符引起的替换后,所有剩余的标识符(包括词法上与关键字相同的标识符)都被替换为pp-numberdefined
,然后每个预处理标记都被转换为一个代币。0
关于您的声明:
在此代码中,我期望在预处理器阶段出现
,因为 macoerror
未定义。HELLO
您不应该期望这种情况,因为 C 标准中没有任何声明说应该发生这种情况,任何信誉良好的第三方文档也没有说应该发生这种情况。当你学习编程时,要警惕对事物应该如何表现的假设。学会依赖书面文档而不是直觉。