C语言的宏问题小结

来源:互联网 发布:淘宝优惠券入口 编辑:程序博客网 时间:2024/05/22 18:18

 今天遇到了一个宏引起的问题,所以总结一下。

(1)#if 后未定义的字符被替换成0

 代码:

#include <stdio.h>

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 <stdio.h>

int  main(int argc, char *argv[])
{
 printf("hello!\n");

#if  (VERSION == NEED_VERSIION)
 printf("world!\n"); 
#endif

 return 0;
}

得出的结果如下:

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