首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

#if directive

预处理器支持条件编译源文件的各个部分。此行为是由控制#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(标识符)

代码语言:javascript
复制
#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
}

输出:

代码语言:javascript
复制
1: yes
2: yes
3: yes

参考

  • C11 standard (ISO/IEC 9899:2011):
    • 6.10.1 Conditional inclusion (p: 162-164)
  • C99 standard (ISO/IEC 9899:1999):
    • 6.10.1 Conditional inclusion (p: 147-149)
  • C89/C90 standard (ISO/IEC 9899:1990):
    • 3.8.1 Conditional inclusion

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com