#if、#elif、#else和#endif指令(c/C++)
#if 指令,与 #elif, #else和 #endif 指令,控件源文件的生成。 如果表达式编写 (在 #if) 后有一个非零值,在 #if 指令后的行组在该翻译单元保留。
语法
条件 :
如果部件optoptelifpartselsepartendif 行如果部件 :
如果行文本如果行 :
#if 常数表达式#ifdef 标识符
#ifndef 标识符
elif 部件 :
elif 行文本elif 部件 elif 行文本
elif 行 :
#elif 常数表达式其他部件 :
其他行文本其他行 :
#elseendif 行 :
#endif
必须以结束 #endif 指令与源文件中的每个 #if 指令。 任意数量的 #elif 指令可以出现在 #if 和 #endif 指令之间,但是,最多一个 #else 指令允许。 #else 指令,如果有,则必须是最后一个指令。 #endif之前。
#if、 #elif、 #else和 #endif 指令在其他 #if 指令的文本块可以嵌套。 每个嵌套 #else, #elif,或者 #endif 指令属于最接近的前 #if 指令。
必须为关闭 #endif 指令与任何条件编译指令,如 #if 和 #ifdef,在文件结尾之前;否则,错误消息生成。 在条件编译指令包含则包含文件,它们必须满足的条件:不需要具有不匹配条件编译指令包含在文件末尾。
宏替换在下面 #elif 命令命令行中的部分执行,因此,宏将调用可用于 常量表达式。
预处理器以进行进一步处理选择一个特定 文本 匹配项。 在 文本 指定的块可以是文本所有订单。 它可以占用多行。 通常 文本 是具有含义为编译器或预处理器的程序文本。
预处理器处理选定的 文本 并将其传递给编译器。 如果 文本 包含预处理器指令,预处理器执行这些指令。 仅文本块选择不由预处理器编译。
预处理器通过计算遵循每个 #if 或 #elif 指令的常数表达式选择单个 文本 项,直到找到真正的 (非零常数表达式。) 它选择所有文本 (从 **#**启动的包含其他预处理器指令) 到其关联的 #elif、 #else或 #endif。
如果 常数表达式 所有匹配项是错误的,或者,如果 #elif 指令未出现,预处理器选择在 #else 子句后文本块。 如果 #else 子句被忽略,并且 常数表达式 所有实例。 #if 的块是错误的,但文本块中选择。
常数表达式 与这些附加限制的一个整数常数表达式:
表达式必须具有整数类型,并且可以由整型常数、字符常数和仅 定义 运算符。
该表达式不能使用 sizeof 或强制转换运算符。
目标环境不能表示整数的任意大小。
该转换表示类型 int 与类型 long相同 unsigned int 与 unsigned long相同。
转换器可以将字符常数提供设置代码值与为目标环境设置的不同。 若要确定目标环境的属性,请检查宏的值从 LIMITS.H 中生成的应用程序到目标环境。
该表达式不能执行任何环境查询,并且必须保持隔离从目标计算机上的实现详细信息。
预处理器运算符 定义 可用于特定常数表达式,如显示按以下语法:
定义 ( identifier )
定义的 identifier
该常数表达式视为 true (非零),如果 标识符 当前定义;否则,该条件为 false (0)。 为空文本中定义的标识符被视为定义。 定义 指令可用于 #if 和 #elif 指令,但是,无处。
在下面的示例中, #if 和 #endif 指令控制生成一个三种机能调用:
#if defined(CREDIT)
credit();
#elif defined(DEBIT)
debit();
#else
printerror();
#endif
,如果标识符 CREDIT 定义,函数调用添加到 credit 编译。 如果标识符 DEBIT 定义,函数调用添加到 debit 编译。 如果两个未定义标识符,对 printerror 的调用编译。 请注意 CREDIT 和 credit 是用 C 和 C++ 的清单的标识符,因为它们的大小写不同。
下面的示例中的条件编译语句假定名为 DLEVEL的以前已定义的符号常数。
#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,首先将指令处理。 否则,语句之后 # 处理。
在第二个示例中的 #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 为已处理。