#if 预编译对未知宏定义的处理 | 您所在的位置:网站首页 › console未定义代码0 › #if 预编译对未知宏定义的处理 |
原文:http://blog.csdn.net/yuanlulu/article/details/8082391
今天遇到了一个宏引起的问题,所以总结一下。 (1)#if 后未定义的字符被替换成0 代码: #include int main(int argc, char *argv[]) { printf("hello!\n"); #if I_LOV_U printf("world!\n"); #endif return 0; } 执行结果为: yuanlulu@ubuntu:~$ ./a.out hello! 结果并不出人意料,但是为啥预处理器没报错呢, 未定义的字符“I_LOV_U”是怎么处理的呢 《C程序设计语言》中的原话是: 预处理器进行宏扩展之后仍然存在的任何标识符都将用0来代替 所以“#if I_LOV_U” 等价于“#if 0” (2)未定义的宏也能打开条件编译 修改代码如下: #include int main(int argc, char *argv[]) { printf("hello!\n"); #if (VERSION == NEED_VERSIION) printf("world!\n"); #endif return 0; } 得出的结果如下: [cpp] view plain copy print? yuanlulu@ubuntu:~$ ./a.out hello! world! 明明那两个宏没有定义,怎么就打开了那段代码了呢? 由上面的知识可知,预处理器进行宏扩展之后仍然存在的任何标识符都将用0来代替,所以“#if (VERSION == NEED_VERSIION)”最后被扩展为 “#if (0 == 0)”,这个条件显然是成立的。
参考: http://sns.linuxpk.com/blog-6583-17087.html http://blog.sina.com.cn/s/blog_4b4b54da0100r2l6.html |
CopyRight 2018-2019 实验室设备网 版权所有 |