一般情况下,源程序中所有的行都参加编译。但是有时希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句,这就是“条件编译”。
为了满足条件编译可以使用#ifdef、#ifndef、#endif等宏指令。
条件编译命令最常见的形式为:
(1)如果宏定义了标识符1,则执行程序段1。
#ifdef 标识符1
//程序段1
#endif
(2)如果宏定义了标识符1,则执行程序段1;否则执行程序段2。
#ifdef 标识符1
//程序段1
#else
//程序段2
#endif
上面的“程序段”可以是语句组,也可以是命令行。“标识符”可以使表达式。#ifdef可以由#ifndef替换,定义完全相反,如(1)中#ifdef由#ifndef替换
下面具两个例子说明#ifdef、#ifndef、#endif等宏指令的使用。
例子1:
如果我们在编写程序时,调试时希望输出一些信息以便于调试,而调试完成后这些信息是不需要输出的,那么我们可以这么做:
#define DEBUG
#ifdef DEBUG
//调试时需要输出的信息语句
#endif
当我们调试完成后,直接把语句#define DEBUG删掉即可,然后#ifdef DEBUG和#endif之间定义的语句便不会被执行。
例子2 :
当A 大于0输出A,A小于0输出-A
#ifdef ISPOSITIVE
#ifdef ISPOSITIVE
cout<<A;
#else
cout<<-A;
#endif
假设我们输入的一直是正数,则定义#ifdef ISPOSITIVE,如果输入一直是负数,则删掉定义#ifdef ISPOSITIVE即可。
总结:
条件编译可以提高C++源程序的通用性。比如例子1中如果输出信息特别多,不使用条件编译也行,但是修改程序量太大。
采用条件编译,可以减少被编译的语句,从而减少目标的长度。当条件编译段比较多时,目标程序长度可以大大减少。比如例子2如果用if语句代替,那么if语句的所有内容都需要编译,即目标程序太长,而使用条件编译则选择性编译,缩减了目标函数长度(如果语句十分长,完全体现了这种优势)。