首页 > 代码库 > 编辑文章 - 博客频道 - CSDN.NET

编辑文章 - 博客频道 - CSDN.NET

时间:2014.07.01

地点:基地

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

一、预处理

  细说条件编译前,先了解下预处理过程。预处理过程读入源码,即对源码进行扫描,检查包含的预处理指令和宏定义,对其进行初步转换,然后再将产生的这种新源码提供给编译器。预处理过程还会删除程序中的注释和多余的空白字符。
  预处理指令以#号开头,后跟指令关键字,指令将在编译器对源码进行编译之前对源码做某些转换。常用的预处理指令有如下:
#空指令               //无任何效果
#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");
}
由于这里程序定义DEBUG宏代表0,所以#if条件为假,不能编译后面的代码直到#endif,所以程序直接输出Running。若是去掉#defin语句也一样.
3.#elif指令
#elif预处理指令综合了#else和#if指令的功能

#define FLAG
{
  #ifdef ONE
  print("1");
  #elif defined TWO
  printf("2");
  #else
  printf("3");
  #endif
}
最后输出2
例1:

#ifdef XXXX
...程序段1.。。
#else
...程序段2.。。
#endif
表明如果标识符XXXX已经被#define命令定义过,则对程序段1进行编译,否则对程序段2进行编译。
比如:

#define NUM
......
#ifdef NUM
printf("is already define NUM");
#else
printf("is not define NUM");
#endif

如果程序开头已有#define NUM这样的一行,即NUM已经被定义,那么,碰到下面的#ifdef NUM的时候,就会执行第一个printf,否则如果上面没有这行定义,就执行第二个printf.
总结一点说:用这种方式,可以很方便的开启和关闭整个程序的某些特定功能

例2:
#ifndef XXXX
...程序段1
#else
...程序段2
#endif
现在使用的是#ifndef,即如果没定义标识符XXXX,那么就会编译程序段1,否则就编译程序段2
例3:
#if 常量
...程序段1
#else
...程序段2
#endif
这里表示如果常量为真就编译程序段1,否则编译程序段2.
这样,这种方法可将测试代码加进来,当需要开启测试时只要将变量设为1,而不需要测试时将变量置为0