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
- C语言的宏问题小结
- c语言指针问题小结
- C语言宏定义的使用小结
- C语言宏的使用小结
- c语言中swap问题小结
- c语言中swap问题小结
- c语言const、volatile问题小结
- C语言宏定义小结
- C语言宏定义小结
- C语言宏定义小结
- C语言宏的一些常规用法小结
- C语言小结--offsetof和container_of宏的使用
- C语言中static的用法小结
- 关于C语言文件操作的小结
- 小结:C语言的输入和输出
- c语言的f函数小结
- c语言的f函数小结
- c语言的小结(1)
- 安倍要美副国务卿转告中国-一厘米土地也不让-安倍晋三-一厘米土地-美国
- QX项目实战-2.模块分类以及配置读取
- 需求与设计过程(1)-用例
- Python备忘
- log4j与log4j.properties的配置
- C语言的宏问题小结
- linux压缩和解压缩命令大全
- android 自己实现qqminihd 左右滑动菜单效果
- 百度的一个笔试题:求字符串的最长数字子串的长度
- Android源码研究(一) 点击事件的响应过程
- Linux下Oracle安装(非界面)
- CTypedPtrList
- ESB架构之企业实施案例
- C/C++常见笔试面试题-03(高质量编程)