条件编译:按照不同的编译条件去编译不同的程序代码,从而使一个源程序在不同的编译条件下生成不同的目标程序。
C++提供几种条件编译指令,以一个表达式或者某个宏是否被定义的条件作为编译条件。
指令 用途
# 空指令,无任何效果
#include 包含一个源代码文件
#define 定义宏
#undef 取消已定义的宏
#if 如果给定条件为真,则编译下面代码
#ifdef 如果宏已经定义,则编译下面代码
#ifndef 如果宏没有定义,则编译下面代码
#elif 如果前面的#if给定条件不为真,当前条件为真,则编译下面代码,其实就是else if的简写
#endif 结束一个#if……#else条件编译块
#error 停止编译并显示错误信息
条件编译命令形式:
1) #ifdef 标识符
程序段1
#else
程序段2
#endif
它的作用是当所指定的标识符已经被#define命令定义过,则在程序编译阶段只编译程序段1,否则编译程序段2。#endif用来限定#ifdef命令的范围。其中#else部分也可以没有。
2) #if 表达式
程序段1
#else
程序段2
#endif
它的作用是当指定的表达式值为真(非零)时就编译程序段1,否则编译程序段2。可以事先给定一定条件,使程序在不同的条件下执行不同的功能。
3) #ifndef 标识符
程序段1
#else
程序段2
#endif
它的作用是当所指定的标识符没有被#define命令定义过,则在程序编译阶段只编译程序段1,否则编译程序段2。#endif用来限定#ifdef命令的范围。其中#else部分也可以没有。
示例1
#include <iostream>
#define LETTER 1
int main()
{
char c,str[]="Language";
int i = 0;
while(c = str[i++]!='\0'){
#if LETTER
if(c>='a'&&c<='z')
c = c-32;
#else
if(c>='A'&&c<='Z')
c = c+32;
#endif
cout << c;
}
}
由于LETTER为真,对第一个if语句进行编译,将小写字母转换成大写字母,输出'LANGUAGE';若LETTER为假,编译第二个语句块,输出为小写;
示例2
#include <iostream>
using namespace std;
#define DEBUG
int main( )
{
int nDebug = 50;
int nRelese = 60;
#ifndef DEBUG //本行为条件编译命令
cout << "Debug : value of version: " << nDebug << endl;
#else
cout << "Relese : value of version: " << nRelese << endl;
cout << "end" << endl;
}
第3行用#define命令的目的不在于用DEBUG代表一个字符串,而只是表示已定义过DEBUG,因此DEBUG后面写什么字符串都无所谓,甚至可以不写字符串。在调试程序时去掉第3行(或在行首加//,使之成为注释行),由于无此行,故未对DEBUG定义,第6行据此决定编译第7行,运行时输出
Relese : value of version: 60
end
在调试完成后,在运行之前,加上第3行,重新编译,由于此时DEBUG已被定义过,运行情况为:
Debug: value of version: 50
end
好处:减少被编译的语句,从而减少目标程序的长度,并且提高了程序的可移植性(比如条件是不同平台或者语言之类的),增加了程序设计的灵活性。