#if 预编译对未知宏定义的处理
来源:互联网 发布:js 判断对象是否包含 编辑:程序博客网 时间:2024/05/18 02:49
原文:http://blog.csdn.net/yuanlulu/article/details/8082391
今天遇到了一个宏引起的问题,所以总结一下。
(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;
}
得出的结果如下:
[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
- #if 预编译对未知宏定义的处理
- gcc预编译#if,#elif,#endif以及常用宏定义
- 整理的宏定义与预编译
- 不同编译器对预编译头文件的处理
- JS预编译对全局变量和命名函数的处理
- xcode 预编译宏定义
- xcode 预编译宏定义
- Unity预编译宏定义
- #if预编译语句的作用
- 预编译 #if #ifdef
- 内存管理、野指针、读写字符的函数、预编译处理、宏定义及条件编译的知识总结
- 对预编译的认识
- 关于C的预编译 宏定义 的一些使用
- C++各平台和编译器的预编译宏定义
- C/C++的预编译和宏定义
- C/C++的预编译和宏定义
- 查看GCC默认定义的预编译宏
- C中的预编译宏定义
- 简单的基于LruCache的图片加载器
- Android 视频播放器
- vim命令总结
- Python函数—基础
- Eclipse常见错误overlaps the location of another project: 'xxx
- #if 预编译对未知宏定义的处理
- org.hibernate.hql.ast.QuerySyntaxException: XX is not mapped [from XX]
- Http协议post请求
- grails executeQuery in
- 内部类详解
- ScrollView嵌套TextView,让TextView可以滚动
- BZOJ 3240 构造矩阵+矩阵快速幂
- Latex使用小结
- Java RSA格式 转换与运算(转)