条件包含

来自cppreference.com
 
 
C++语言

|- class="t-nv-h1" | colspan="5" | 一般主题 |- | |- |

预处理器
注释

|

|-

|- class="t-nv-h1" | colspan="5" | 流程控制 |-

条件执行语句

| |- |

|

|-

循环语句

| |- |

|

|-

跳转语句

| |- |

|

|-

|- class="t-nv-h1" | colspan="5" | 函数 |-

函数声明 Lambda函数声明 inline说明符 异常说明符 (已弃用) noexcept说明符 (C++11)

|- class="t-nv-h1" | colspan="5" | Exceptions |- | |- |

|

|-

|- class="t-nv-h1" | colspan="5" | 命名空间 |- | |- |

|

|-

|- class="t-nv-h1" | colspan="5" | 类型 |- | |- |

|

|-

说明符

| |- |

decltype (C++11)
auto (C++11)
alignas (C++11)

|

|-

存储持续期说明符 Initialization

| |- |

|

|-

|- class="t-nv-h1" | colspan="5" | 表达式 |- | |- |

值类别
求值顺序

|

|-

替代表示 字面量 布尔型 - 整型 - 浮点型 字符型 - 字符串 - nullptr (C++11) 用户定义 (C++11)

|- class="t-nv-h1" | colspan="5" | Utilities |-

属性 (C++11) Types typedef声明 类型别名声明 (C++11) Casts 隐式类型转换 - 显示类型转换 static_cast - dynamic_cast const_cast - reinterpret_cast 内存分配

| |- |

|

|-

|- class="t-nv-h1" | colspan="5" | 类 |- | |- |

|

|-

类特有的函数属性

| |- |

|

explicit (C++11)
static

|-

静态成员函数

| |- |

|

|- |- class="t-nv-h1" | colspan="5" | 模板 |- | |- |

|

|- |- class="t-nv-h1" | colspan="5" | 杂项 |- | |- |

|

|-

 
 

预处理器支持有条件的编译部分源文件。这一行为由#if#else#elif#ifdef#ifndef#endif指令控制。

目录

[编辑] 语法

#if expression
#ifdef expression
#ifndef expression
#elif expression
#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

expression是一个常量表达式。

如果表达式中包含形如defined identifierdefined (identifier)的单目运算符,那么这一运算符将首先被求值。如果identifier已经被定义为一个宏,那么结果为1,否则结果为0

defined运算符求值与宏替换之后,除布尔常量以外的标识符,将被替换为数字0

如果expression的值不为零,那么被其控制的代码块将被包含,否则该代码块将被跳过。

[编辑] #ifdef, #ifndef

检测一个标识符是否被定义为一个宏

#ifdef identifier#if defined( identifier)是等价的。

#ifndef identifier#if !defined( identifier)是等价的。

[编辑] 示例

#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语言文档 for 条件包含
来自“http://zh.cppreference.com/mwiki/index.php?title=cpp/preprocessor/conditional&oldid=38972