#if 指令中未定义宏?

问题描述 投票:0回答:1
#include<stdio.h>
int main()
{
#if HELLO
   printf("%d\n",1);
#endif
}

在此代码中,我期望在预处理器阶段出现

error
,因为 maco
HELLO
未定义。但它不会产生任何错误,并且简单地忽略该
printf
语句。为什么这里
#if
指令充当
#ifdef
指令?

c macros preprocessor
1个回答
1
投票

C 2018 6.10.1 4 表示

#if
指令中未定义为宏或与
defined
运算符一起使用的每个标识符都将替换为
0
:

…在执行完所有由于宏扩展和

defined
一元运算符引起的替换后,所有剩余的标识符(包括词法上与关键字相同的标识符)都被替换为pp-number
0
,然后每个预处理标记都被转换为一个代币。

关于您的声明:

在此代码中,我期望在预处理器阶段出现

error
,因为 maco
HELLO
未定义。

您不应该期望这种情况,因为 C 标准中没有任何声明说应该发生这种情况,任何信誉良好的第三方文档也没有说应该发生这种情况。当你学习编程时,要警惕对事物应该如何表现的假设。学会依赖书面文档而不是直觉。

© www.soinside.com 2019 - 2024. All rights reserved.