情况1:预处理指示符(条件指示符)ifdef:
#ifdef _XXXX
......
#else
......
#endif
用来判断一个预处理器常量是否已经被定义,以便有条件的包含程序代码。
作用:可以很方便的开启/关闭整个程序的某项特定功能。
情况2:预处理指示符(条件指示符)ifndef
# ifndef FILE_H
# define FILE_H
/*file.h*/
#else
.....
#endif
这里的#ifndef,表示的是if not def。表示如果FILE_H常量没有被定义,则程序会初始化一个默认值,执行预编译里面的内容;
作用:可以防止头文件的重复编译(嵌套包含).
情况3:
#if 常量
...程序段1...
#else
...程序段2...
#endif
表示如果常量为真(非0),就执行程序段1,否则执行程序段2。
作用:这种方法可以将测试代码加进来。当需要开启测试的时候,
只要将常量变1就好了。而不要测试的时候,只要将常量变0。
有人会问:不用条件编译命令而直接用if语句也能达到要求,用条件编译命令有什么好处呢?的确,此问题完全可以不用条件编译处理,但那样做目标程序长(因为所有语句都编译),而采用条件编译,可以减少被编译的语句,从而减少目标的长度。当条件编译段比较多时,目标程序长度可以大大减少。
条件编译案例:
#include "stdafx.h"
#include <iostream>
using namespace std;
#define NUM 0
int main(int argc, char* argv[])
{
#ifdef NUM
printf("NUM已经宏定义过了!\n");
#else
printf("NUM还没有宏定义过!\n");
//结束预编译
#endif
//编译预处理语句
#ifndef _NUM_
#define _NUM_
printf("只能进行一次编译,防止重复编译!\n");
//结束编译预处理
#endif
#if 1
printf("非0表示为真,执行!\n");
#else
printf("为0表示假,不执行!\n");
#endif
return 0;
}
编译C++程序时,编译器自动定义了一个预处理器名字__cplusplus,可以根据他来判断该程序是不是C++程序,以便有条件编译一些代码。另外两个比较有用的预定义名字是:__LINE__和__FILE__。前者记录文件已经被编译的行数,后则包含正在被编译的文件的名字。另外__TIME__和__DATA__表示当前时间和日期。