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