今天遇到了一个宏引起的问题,所以总结一下。
(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