条件编译(#ifdef #else #endif #if)

一、预处理

  细说条件编译前,先了解下预处理过程。预处理过程读入源码,即对源码进行扫描,检查包含的预处理指令和宏定义,对其进行初步转换,然后再将产生的这种新源码提供给编译器。预处理过程还会删除程序中的注释和多余的空白字符。
  预处理指令以#号开头,后跟指令关键字,指令将在编译器对源码进行编译之前对源码做某些转换。常用的预处理指令有如下:
#空指令               //无任何效果
#include<>          //包含一个源码文件
#define                //定义一个宏
#undef                //取消已定义的宏
#if                       //如果给定条件为真,则编译如下代码
#ifdef                  //如果宏没有定义,则编译下面代码
#ifndef                //如果宏没有定义,则编译下面代码
#elif                    //如果前面的#if给定条件不为真,而满足当前分支条件,则编译下面代码
#endif                 //结束一个#if...#else条件编译块
#error                 //停止编译并显示错误信息
#line                   //改变编译器用来指出警告和错误信息的文件号和行号
#pragma             //编译器自定义用途,一般是禁止或允许某些烦人的警告信息

----------------------------------------------------------------------------

二、文件包含

#include预处理指令的功能是在指令处展开被包含的文件。这种包含是多重的,即在一个被包含的文件中还可以包含其他文件。预处理过程不会检查在转换单元中是否已经包含了某个文件并阻止它的重复(多次)包含。于是,我们可以通过给定编译时条件来达到不同的效果。比如:
为了避免只能包含一次的头文件被重复包含,我们可以在头文件中用编译时条件进行控制。//my header file
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //my_header.h  
  2. #ifndef MY_HEADER_H  
  3. #define MY_HEADER_H  
  4. ......  
  5. #endif  
在程序中包含头文件的方式
1.用尖括号include,形如:
#include<myheader.h>
这种方式告诉预处理器程序在编译器自带的或外部库的头文件中搜索被包含的头文件。
2.用双引号include,形如:
#include"myheader.h"
这种方式告诉预处理器程序在当前被编译的应用程序的源代码文件中搜索被包含的头文件,如果找不到,再搜索编译器自带的头文件。

----------------------------------------------------------------------------
三、条件编译
  条件编译指令将决定哪些代码被编译哪些代码不被编译,就向在程序中,哪段代码将在什么样的条件下降被执行。
1.#if指令
#if指令检测后面的编译条件(一个常量表达式),为真则编译后面的代码,直到出现#else、#elif或#endif为止。为假则不编译。
2.#endif指令
#endif用于终止#if预处理指令。
比如:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #define DEBUG 0  
  2. int main()  
  3. {  
  4.   #if DEBUG   
  5.   printf("Debugging");  
  6.   #endif  
  7.   printf("Running");  
  8. }  
由于这里程序定义DEBUG宏代表0,所以#if条件为假,不能编译后面的代码直到#endif,所以程序直接输出Running。若是去掉#defin语句也一样.
3.#elif指令
#elif预处理指令综合了#else和#if指令的功能
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #define FLAG  
  2. {  
  3.   #ifdef ONE  
  4.   print("1");  
  5.   #elif defined TWO  
  6.   printf("2");  
  7.   #else  
  8.   printf("3");  
  9.   #endif  
  10. }  
最后输出2
条件编译情况1
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #ifdef XXXX  
  2. ...程序段1.。。  
  3. #else  
  4. ...程序段2.。。  
  5. #endif  
表明如果标识符XXXX已经被#define命令定义过,则对程序段1进行编译,否则对程序段2进行编译。
比如:
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #define NUM  
  2. ......  
  3. #ifdef NUM  
  4. printf("is already define NUM");  
  5. #else  
  6. printf("is not define NUM");  
  7. #endif  

如果程序开头已有#define NUM这样的一行,即NUM已经被定义,那么,碰到下面的#ifdef NUM的时候,就会执行第一个printf,否则如果上面没有这行定义,就执行第二个printf.
总结一点说:用这种方式,可以很方便的开启和关闭整个程序的某些特定功能
2.情况2
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #ifndef XXXX  
  2. ...程序段1  
  3. #else  
  4. ...程序段2  
  5. #endif  
现在使用的是#ifndef,即如果没定义标识符XXXX,那么就会编译程序段1,否则就编译程序段2
3.情况2
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #if 常量  
  2. ...程序段1  
  3. #else  
  4. ...程序段2  
  5. #endif  
这里表示如果常量为真就编译程序段1,否则编译程序段2.

这样,这种方法可将测试代码加进来,当需要开启测试时只要将变量设为1,而不需要测试时将变量置为0


网址:http://blog.csdn.net/u012333003/article/details/36187579

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值