条件包含
预处理器支持有条件地编译部分源文件。这一行为由 #if
、#else
、#elif
、#ifdef
、#ifndef
与 #endif
指令所控制。
目录 |
[编辑] 语法
#if 表达式
|
|||||||||
#ifdef 表达式
|
|||||||||
#ifndef 表达式
|
|||||||||
#elif 表达式
|
|||||||||
#else
|
|||||||||
#endif
|
|||||||||
[编辑] 解释
条件编译预处理块由 #if
、#ifdef
或 #ifndef
指令开始,并可选地包含任意多个 #elif
指令,接下来是至多一个可选的 #else
指令,并以 #endif
指令结束。嵌套的条件编译区块会被单独处理。
各个 #if
、#elif
、#else
、#ifdef
和 #ifndef
指令所控制的代码块在第一个不属于内部嵌套的条件编译区块的 #elif
、#else
或 #endif
指令处结束。
#if
、#ifdef
和 #ifndef
指令测试其所指定的条件(见下文),如果条件求值为真,则编译其控制的代码块。此时后续的 #else
和 #elif
指令将被忽略。否则,如果所指定的条件求值为假,则将跳过其所控制的代码块,然后处理后续的 #else
或 #elif
指令(如果存在)。前一种情况下,#else
指令所控制的代码块将会被无条件地进行编译。后一种情况下,#elif
指令按照与 #if
指令相同的方式执行:即测试条件是否满足,并根据其结果决定编译或跳过其所控制的代码块,后一种情况下继续处理后续的 #elif
和 #else
指令。条件编译区块以 #endif
指令结束。
[编辑] 条件的求值
[编辑] #if, #elif
表达式 是一个常量表达式。
如果表达式中包含形如“defined
标识符”或“defined (
标识符)
”的一元运算符,那么首先对其求值。当这个标识符已经被定义为宏名或者这个标识符为 __has_include (C++17 起)时其结果为 1,否则结果为 0。
在宏展开和 defined
运算符的求值后,任何不是布尔字面量的标识符都被替换为数值 0 。
当 表达式 求值为非零值时,将包含其所控制的代码块,否则将跳过该代码块。
注: |
(C++14 前) |
[编辑] #ifdef, #ifndef
检测一个标识符是否被定义为宏名。
#ifdef
标识符 与 #if defined(
标识符)
基本上是等价的。
#ifndef
标识符 与 #if !defined(
标识符)
基本上是等价的。
[编辑] 示例
#define ABCD 2 #include <iostream> int main() { #ifdef ABCD std::cout << "1: yes\n"; #else std::cout << "1: no\n"; #endif #ifndef ABCD std::cout << "2: no1\n"; #elif ABCD == 2 std::cout << "2: yes\n"; #else std::cout << "2: no2\n"; #endif #if !defined(DCBA) && (ABCD < 2*4-3) std::cout << "3: yes\n"; #endif }
输出:
1: yes 2: yes 3: yes
[编辑] 缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
DR | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
CWG 1955 | C++14 | 要求失败的 #elif 中的表达式合法 | 跳过失败的 elif |
[编辑] 参阅
条件包含的 C 文档
|