Conditional inclusion
条件包含
预处理器支持条件编译源文件的各个部分。此行为是由控制#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
指令测试指定的条件(见下文),如果它的计算结果为true,则编译受控代码块。在这种情况下,后续#else
和#elif
指令被忽略。否则,如果指定的条件评估为false,则会跳过受控代码块并处理后续#else
或#elif
指令(如果有)。在前一种情况下,由#else
指令控制的代码块被无条件编译。在后一种情况下,#elif
指令的行为就好像它是一个#if
指令:检查条件,根据结果编译或跳过受控代码块,在后一种情况下处理后续指令#elif
和#else
指令。条件预处理块由#endif
指示。
有条件的评估
#if, #elif
该表达式是一个常量表达式,仅使用文字和标识符,使用#define
伪指令定义 。任何标识符(不是字面值,使用#define
指令未定义 )都会计为0
。
表达式可以包含表单defined
标识符或defined (
标识符中的一元运算符)
,1
如果标识符是使用#define
伪指令定义的,则返回标识符 ,否则返回0
如果表达式计算为非零值,则包含受控代码块并以其他方式跳过。如果任何使用的标识符不是一个常量,它将被替换为0
。
注意:#if cond1 ... #elif cond2不同于#if cond1 ...#else然后是#if cond3,因为如果cond1为true,则会跳过第二个#if,并且cond3不需要格式良好,而#elif的cond2必须是有效的表达式。 | (直到C11) |
---|
#ifdef, #ifndef
检查标识符是否使用#define
伪指令定义 。
#ifdef
标识符实质上等同于#if defined(
标识符)
。
#ifndef
标识符实质上等同于#if !defined(
标识符)
。
例
#define ABCD 2
#include <stdio.h>
int main(void)
{
#ifdef ABCD
printf("1: yes\n"
#else
printf("1: no\n"
#endif
#ifndef ABCD
printf("2: no1\n"
#elif ABCD == 2
printf("2: yes\n"
#else
printf("2: no2\n"
#endif
#if !defined(DCBA) && (ABCD < 2*4-3)
printf("3: yes\n"
#endif
}
输出:
1: yes
2: yes
3: yes
参考
- C11 standard (ISO/IEC 9899:2011):