#if 预编译对未知宏定义的处理 您所在的位置:网站首页 console未定义代码0 #if 预编译对未知宏定义的处理

#if 预编译对未知宏定义的处理

2024-07-11 16:38| 来源: 网络整理| 查看: 265

原文: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 实验室设备网 版权所有