条件编译是指按照给定的条件决定哪些源代码参与编译,而哪些源代码不参与编译,从而使一个源程序在不同编译条件下生不同的目标程序。C++提供几种不同形式的条件编译指令,可以将一个表达式或者某个宏是否被定义作为编译条件,主要用于设计便于调试的程序或可移值的程序。
条件编译指令有多种,其结构类似于if语句结构。条件编译指令分别以#if、#ifdef或#ifndef指令开始,中间可以有#else指令,最后以#endif指令表示一条编译指令的结束。下面给出条件编译指令常用的三种形式:
#if...[#else]...#endif
#ifdef...[#else]...#endif
#ifndef...[#else]...#endif
#if指令检测其后表达式的值是否为真,如果为真,则随后的源代码要参与编译,直到出#else或#endif;如果不为真,则随后的源代码不参与编译。#ifdef指令是#if defined指令的缩写,它检测其后的宏是否被定义,如果被定义过,则随后的源代码要参与编译。#ifndef指令也检测其后的宏是否被定义,但不同的是,只有当该宏没有被定义过,随后的源代码参与编译。
例 使用条件编译指令
(1)#if指令的用法
#include <iostream.h>
#define MAX 100 //宏定义
void main()
{
#if MAX > 99 //条件编译
cout << "MAX is greater than 99 !" << endl;
#else
cout << "MAX is small !" << endl;
#endif
}
在程序中,由于MAX定义的值大于99,所以#if和#else之间的源代码要参与编译。程序运行后显示:
MAX is greater than 99 !
(2)#ifdef指令用法
#include <iostream.h>
#define DEBUG //宏定义
int main()
{
int nDebug=50;
int nRealse=6;
#ifdef DEBUG //条件编译
cout <<"DEBUG:value of version is " << nDebug << endl; //调试版
#else
cout <<"RELEASE:value of version is " << nRealse << endl;//正式版
#endif
#ifndef DEBUG //条件编译
cout <<"DEBUG:value of version is " << nDebug << endl; //调试版
#else
cout <<"RELEASE:value of version is " << nRealse << endl;//正式版
#endif
return 1;
}
在程序中,标识符DEBUG是否被#define指令定义作为编译条件。利用#ifdef指令,根据DEBUG是否被定义确定具体编译哪一条源代码。程序运行后显示:
DEBUG:value of version is 50
RELEASE:value of version is 6