一、预处理
细说条件编译前,先了解下预处理过程。预处理过程读入源码,即对源码进行扫描,检查包含的预处理指令和宏定义,对其进行初步转换,然后再将产生的这种新源码提供给编译器。预处理过程还会删除程序中的注释和多余的空白字符。预处理指令以#号开头,后跟指令关键字,指令将在编译器对源码进行编译之前对源码做某些转换。常用的预处理指令有如下:
#空指令 //无任何效果
#include<> //包含一个源码文件
#define //定义一个宏
#undef //取消已定义的宏
#if //如果给定条件为真,则编译如下代码
#ifdef //如果宏没有定义,则编译下面代码
#ifndef //如果宏没有定义,则编译下面代码
#elif //如果前面的#if给定条件不为真,而满足当前分支条件,则编译下面代码
#endif //结束一个#if...#else条件编译块
#error //停止编译并显示错误信息
#line //改变编译器用来指出警告和错误信息的文件号和行号
#pragma //编译器自定义用途,一般是禁止或允许某些烦人的警告信息
----------------------------------------------------------------------------
二、文件包含
#include预处理指令的功能是在指令处展开被包含的文件。这种包含是多重的,即在一个被包含的文件中还可以包含其他文件。预处理过程不会检查在转换单元中是否已经包含了某个文件并阻止它的重复(多次)包含。于是,我们可以通过给定编译时条件来达到不同的效果。比如:为了避免只能包含一次的头文件被重复包含,我们可以在头文件中用编译时条件进行控制。//my header file
- //my_header.h
- #ifndef MY_HEADER_H
- #define MY_HEADER_H
- ......
- #endif
1.用尖括号include,形如:
#include<myheader.h>
这种方式告诉预处理器程序在编译器自带的或外部库的头文件中搜索被包含的头文件。
2.用双引号include,形如:
#include"myheader.h"
这种方式告诉预处理器程序在当前被编译的应用程序的源代码文件中搜索被包含的头文件,如果找不到,再搜索编译器自带的头文件。
----------------------------------------------------------------------------
三、条件编译
条件编译指令将决定哪些代码被编译哪些代码不被编译,就向在程序中,哪段代码将在什么样的条件下降被执行。
1.#if指令
#if指令检测后面的编译条件(一个常量表达式),为真则编译后面的代码,直到出现#else、#elif或#endif为止。为假则不编译。
2.#endif指令
#endif用于终止#if预处理指令。
比如:
- #define DEBUG 0
- int main()
- {
- #if DEBUG
- printf("Debugging");
- #endif
- printf("Running");
- }
3.#elif指令
#elif预处理指令综合了#else和#if指令的功能
- #define FLAG
- {
- #ifdef ONE
- print("1");
- #elif defined TWO
- printf("2");
- #else
- printf("3");
- #endif
- }
条件编译情况1
- #ifdef XXXX
- ...程序段1.。。
- #else
- ...程序段2.。。
- #endif
比如:
- #define NUM
- ......
- #ifdef NUM
- printf("is already define NUM");
- #else
- printf("is not define NUM");
- #endif
如果程序开头已有#define NUM这样的一行,即NUM已经被定义,那么,碰到下面的#ifdef NUM的时候,就会执行第一个printf,否则如果上面没有这行定义,就执行第二个printf.
总结一点说:用这种方式,可以很方便的开启和关闭整个程序的某些特定功能
2.情况2
- #ifndef XXXX
- ...程序段1
- #else
- ...程序段2
- #endif
3.情况2
- #if 常量
- ...程序段1
- #else
- ...程序段2
- #endif
这样,这种方法可将测试代码加进来,当需要开启测试时只要将变量设为1,而不需要测试时将变量置为0
网址:http://blog.csdn.net/u012333003/article/details/36187579