conditional :
if-part elif-parts opt else-partopt endif-line
if-part :
if-line text
if-line :
#if constant-expression
#ifdef identifier
#ifndef identifier
elif-parts :
elif-line text
elif-parts elif-line text
elif-line :
#elif constant-expression
else-part :
else-line text
else-line :
#else
endif-line :
#endif
#if defined(CREDIT)
credit();
#elif defined(DEBIT)
debit();
#else
printerror();
#endif
如果定义了标识符 CREDIT,则编译对 credit 的函数调用。 如果定义了标识符 DEBIT,则编译对 debit 的函数调用。 如果两个标识符都未定义,则编译对 printerror 的调用。 请注意,CREDIT 和 credit 是 C 和 C++ 中的不同标识符,因为它们的情况不同。
#if DLEVEL > 5
#define SIGNAL 1
#if STACKUSE == 1
#define STACK 200
#else
#define STACK 100
#endif
#else
#define SIGNAL 0
#if STACKUSE == 1
#define STACK 100
#else
#define STACK 50
#endif
#endif
#if DLEVEL == 0
#define STACK 0
#elif DLEVEL == 1
#define STACK 100
#elif DLEVEL > 5
display( debugptr );
#else
#define STACK 200
#endif
第一个 #if 块显示两组嵌套的 #if、#else 和 #endif 指令。 仅当 DLEVEL > 5 为 true 时,才会处理第一组指令。 否则,处理 #else 后面的语句。
第二个示例中的 #elif 和 #else 指令用于根据 DLEVEL 的值做出四种选择之一。 将常量 STACK 设置为 0、100 或 200,具体取决于 DLEVEL 的定义。 如果 DLEVEL 大于 5,则编译
#elif DLEVEL > 5
display(debugptr);
该语句,并且不会定义 STACK。
条件编译的常见用途是防止多次包含同一个头文件。 在 C++ 中,通常在头文件中定义类,如下构造可用于防止多个定义:
/* EXAMPLE.H - Example header file */
#if !defined( EXAMPLE_H )
#define EXAMPLE_H
class Example
{
...
};
#endif // !defined( EXAMPLE_H )
前面的代码将检查以查看是否定义了符号常量 EXAMPLE_H。 如果是这样,则已包括该文件,并且不需要重新处理该文件。 否则,定义常量 EXAMPLE_H 以将 EXAMPLE.H 标记为已处理