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