#if、#elif、#else 和 #endif 指令
预处理器指令,用于控制源文件部分的编译。
#if ifCondition ... |
---|
[#elif elifCondition ...] |
[#else ...] |
#endif |
parameters
项 | 说明 |
---|---|
ifCondition |
要评估的主要条件。 如果此参数的计算结果为非零值,则此#if指令与#elif、#else或#endif指令的下一个实例之间的所有文本都将保留在转换单元中;否则,不会保留后续源代码。 条件可以使用定义的预处理器运算符来确定是定义了特定的预处理器常量还是宏;此用法等效于 使用 #ifdef 指令。 有关 ifCondition 参数值的限制,请参阅备注部分。 |
elifCondition [可选] |
要评估的其他条件。 如果 ifCondition 参数和所有以前的#elif指令的计算结果为零,并且此参数的计算结果为非零值,则此#elif指令与#elif、#else或#endif指令的下一个实例之间的所有文本都将保留在转换单元中;否则,不会保留后续源代码。 条件可以使用定义的预处理器运算符来确定是定义了特定的预处理器常量还是宏;此用法等效于 使用 #ifdef 指令。 有关 elifCondition 参数值的限制,请参阅备注部分。 |
备注
源文件中的每个 #if 指令必须与表示结束的 #endif 指令匹配。 任意数量的 #elif 指令可以出现在 #if 和 #endif 指令之间,但最多允许一个 #else 指令。 #else 指令(如果有)必须是 #endif 之前的最后一个指令。 包含文件中包含的条件编译指令必须满足相同的条件。
#if、#elif、#else 和 #endif 指令可以嵌套在其他 #if 指令的 text 部分中。 每个嵌套的 #else、#elif 或 #endif 指令属于最靠近的前面的 #if 指令。
如果没有条件的计算结果为非零值,则预处理器在 #else 指令之后选择文本块。 如果省略 #else 子句,并且没有条件的计算结果为非零值,则不会选择文本块。
ifCondition 和 elifCondition 参数非常符合以下要求:
- 条件编译表达式被视为 有符号的长 值,这些表达式使用与 C++ 中的表达式相同的规则进行计算。
- 表达式必须具有整型,并且只能包含整数常量、字符常量和 defined 运算符。
- 表达式不能使用 sizeof 或 type-cast 运算符。
- 目标环境无法表示整数的所有范围。
- 转换表示类型 int 与 long 类型相同, unsigned int 与 unsigned long 相同。
- 转换器可以将字符常量转换为与目标环境的集不同的代码值集。 若要确定目标环境的属性,请从为目标环境生成的应用程序中的 LIMITS.H 中检查宏的值。
- 该表达式不得执行任何环境查询,并且必须不受与目标计算机上的实现详细信息的影响。
示例
本部分包含演示如何使用条件编译预处理器指令的示例。
使用定义的运算符
以下示例演示如何使用定义的运算符。 如果定义了标识符 CREDIT,则编译对 credit 函数的调用。 如果定义了标识符 DEBIT,则编译对 借方 函数的调用。 如果两个标识符均未定义,则编译对 printerror 函数的调用。 请注意,“CREDIT”和“credit”是 C 和 C++ 中的非重复标识符,因为它们的情况不同。
#if defined(CREDIT)
credit();
#elif defined(DEBIT)
debit();
#else
printerror();
#endif
使用嵌套#if指令
以下示例演示如何嵌套 #if 指令。 此示例假定之前已定义名为 DLEVEL 的符号常量。 #elif 和 #else 指令用于根据 DLEVEL 的值做出四个选项之一。 常量 STACK 设置为 0、100 或 200,具体取决于 DLEVEL 的定义。 如果 DLEVEL 大于 5,则不定义 STACK。
#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
用于包括头文件
条件编译的常见用途是防止多次包含同一个头文件。 在 C++ 中,类通常在头文件中定义,条件编译构造可用于防止多个定义。 以下示例确定是否定义了符号常量EXAMPLE_H。 如果是这样,则该文件已被包含,不需要重新处理;如果不是,则定义常量EXAMPLE_H以指示该示例。H 已处理。
#if !defined( EXAMPLE_H )
#define EXAMPLE_H
class Example
{
...
};
#endif // !defined( EXAMPLE_H )