#if defined和#if !defined(c语言的宏定义)
来源:互联网 发布:软件测试 回归策略 编辑:程序博客网 时间:2024/06/10 15:03
因为对于一个大程序而言,我们可能要定义很多常量( 不管是放在源文件还是头文件 ),那么我们有时考虑定义某个常量时,我们就必须返回检查原来此常量是否定义,但这样做很麻烦.if defined宏正是为这种情况提供了解决方案.举个例子,如下:
#define ....
#define ....
....
....
#define a 100
....
此时,我们要检查a是否定义(假设我们已经记不着这点了),或者我们要给a一个不同的值,就加入如下句子
#if defined a
#undef a
#define a 200
#endif
上述语句检验a是否被定义,如果被定义,则用#undef语句解除定义,并重新定义a为200
同样,检验a是否定义:
#ifndef a //如果a没有被定义
#define a 100
#endif
以上所用的宏中:#undef为解除定义,#ifndef是if not defined的缩写,即如果没有定义。
这就是#if defined 的唯一作用!
#define ....
#define ....
....
....
#define a 100
....
此时,我们要检查a是否定义(假设我们已经记不着这点了),或者我们要给a一个不同的值,就加入如下句子
#if defined a
#undef a
#define a 200
#endif
上述语句检验a是否被定义,如果被定义,则用#undef语句解除定义,并重新定义a为200
同样,检验a是否定义:
#ifndef a //如果a没有被定义
#define a 100
#endif
以上所用的宏中:#undef为解除定义,#ifndef是if not defined的缩写,即如果没有定义。
这就是#if defined 的唯一作用!
1)
#if defined XXX_XXX
#endif
是条件编译,是根据你是否定义了XXX_XXX这个宏,而使用不同的代码。
一般.h文件里最外层的
#if !defined XXX_XXX
#define XXX_XXX
#endif
是为了防止这个.h头文件被重复include。
2)
#error XXXX
是用来产生编译时错误信息XXXX的,一般用在预处理过程中;
例子:
#if !defined(__cplusplus)
#error C++ compiler required.
#endif
#if defined XXX_XXX
#endif
是条件编译,是根据你是否定义了XXX_XXX这个宏,而使用不同的代码。
一般.h文件里最外层的
#if !defined XXX_XXX
#define XXX_XXX
#endif
是为了防止这个.h头文件被重复include。
2)
#error XXXX
是用来产生编译时错误信息XXXX的,一般用在预处理过程中;
例子:
#if !defined(__cplusplus)
#error C++ compiler required.
#endif
#if、#ifdef、#if defined之间的区别
#if的使用说明
#if的后面接的是表达式
#if (MAX==10)||(MAX==20) code...#endif
它的作用是:如果(MAX==10)||(MAX==20)成立,那么编译器就会把其中的#if 与 #endif之间的代码编译进去(注意:是编译进去,不是执行!!)
#if defined的使用
#if后面接的是一个宏。
#if defined (x) ...code...#endif
这个#if defined它不管里面的“x”的逻辑是“真”还是“假”它只管这个程序的前面的宏定义里面有没有定义“x”这个宏,如果定义了x这个宏,那么,编译器会编译中间的…code…否则不直接忽视中间的…code…代码。
另外 #if defined(x)也可以取反,也就用 #if !defined(x)
#ifdef的使用
#ifdef的使用和#if defined()的用法一致
#ifndef又和#if !defined()的用法一致。
#ifdef 和 #if defined 的区别在于,后者可以组成复杂的预编译条件,比如#if defined (AAA) && defined (BBB)xxxxxxxxx#endif#if defined (AAA) || VERSION > 12xxxxxxxxx#endif而#ifdef 就不能用上面的用法,也就是说,当你要判断单个宏是否定义时#ifdef 和 #if defined 效果是一样的,但是当你要判断复杂的条件时,只能用 #if defined
最后强调两点:
第一:这几个宏定义只是决定代码块是否被编译!
第二:别忘了#endif
1 0
- #if defined和#if !defined(c语言的宏定义)
- #if defined和#if !defined(c语言的宏定义)
- #if defined和#if !defined(c语言的宏定义)
- #if defined和#if !defined(c语言的宏定义)
- #if defined和#if !defined(c语言的宏定义)
- #if defined和#if !defined(c语言的宏定义)
- #if defined和#if !defined(c语言的宏定义)
- #if defined和#if !defined(c语言的宏定义)
- #if defined和#if !defined(c语言的宏定义)
- #if defined和#if !defined(c语言的宏定义)
- #if defined和#if !defined(c语言的宏定义)
- #if defined和#if !defined(c语言的宏定义)
- #if defined和#if !defined(c语言的宏定义)
- #if defined和#if !defined(c语言的宏定义)
- #if defined和#if !defined(c语言的宏定义)
- #if defined和#if !defined(c语言的宏定义)
- C语言的宏定义(1)—— #if defined和#if !defined
- #if defined和#if !defined
- Swift基本数据类型
- HashIds
- 获得用户的地理信息
- 【BZOJ1001】[BeiJing2006]狼抓兔子【最小割】【最短路】【对偶图】
- [LeetCode]67 二进制相加
- #if defined和#if !defined(c语言的宏定义)
- Java开发中的23种设计模式详解
- 继上篇,俄罗斯方块代码
- IOS在线视频播放
- UML系列图--用例图
- Binder通信流程图
- 实体类的枚举属性--原来支持枚举类型这么简单,没有EF5.0也可以
- POJ-3261 Milk Patterns (后缀数组 最长k次重复子串)
- Hibernate核心接口学习