条件包含

来自cppreference.com
 
 
C++语言
表达式
替代表示
字面量
布尔型 - 整型 - 浮点型
字符型 - 字符串 - nullptr (C++11)
用户定义 (C++11)
Utilities
属性 (C++11)
Types
typedef声明
类型别名声明 (C++11)
Casts
隐式类型转换 - 显示类型转换
static_cast - dynamic_cast
const_cast - reinterpret_cast
内存分配
类特有的函数属性
explicit (C++11)
static
静态成员函数
模板
杂项
 
 

预处理器支持有条件的编译部分源文件。这一行为由#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文档