C语言的宏问题小结

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

(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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值