为何#if指令遇未定义宏HELLO未报错,表现类似#ifdef?
问题解答
首先看你提供的代码:
#include<stdio.h> int main() { #if HELLO printf("%d\n",1); #endif }
你疑惑为什么HELLO未定义时#if指令没报错,反而和#ifdef表现类似?这是因为C预处理器的规则明确规定:在#if或#elif的表达式中,任何未定义的标识符都会被当作值为0的常量处理,而不是触发编译错误。
具体到你的代码,未定义的HELLO在#if HELLO里会被替换成0,等价于写了#if 0,所以预处理器会直接跳过#if和#endif之间的printf代码块,自然不会报错,效果看起来就和#ifdef HELLO(检查宏是否存在,不存在就跳过)一样。
需要注意的是,#ifdef HELLO只关心HELLO有没有被定义,不管定义的值是多少;但#if HELLO本质是判断表达式的值是否非0,只是未定义的宏会被当作0,才出现了类似的结果。
内容的提问来源于stack exchange,提问作者Baranitharan
相关产品推荐
相关产品推荐

