#if、#elif、#else和#endif指令(c/C++)

#if 指令,与 #elif, #else和 #endif 指令,控件源文件的生成。 如果表达式编写 (在 #if) 后有一个非零值,在 #if 指令后的行组在该翻译单元保留。

语法

  • 条件 :
    如果部件optoptelifpartselsepartendif 行

  • 如果部件 :
    如果行文本

  • 如果行 :
    #if 常数表达式

    #ifdef 标识符

    #ifndef 标识符

  • elif 部件 :
    elif 行文本

    elif 部件 elif 行文本

  • elif 行 :
    #elif 常数表达式

  • 其他部件 :
    其他行文本

  • 其他行 :
    #else

  • endif 行 :
    #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 为已处理。

请参见

参考

预处理器指令