11-4. 条件编译

  • 学习人数 30K+
  • 适合所有人群学习
avatar
林耿亮

你好编程主讲老师

1. 分支结构

之前,我们学习过程序中的分支结构。在预处理中,也有类似的分支结构。我们先写一个顺序结构的代码。

#include <stdio.h>

int main()
{   
    printf("111111\n");
    printf("222222\n");
    printf("333333\n");

    printf("AAAAAA\n");
    printf("BBBBBB\n");
    printf("CCCCCC\n");

    return 0;
}

顺序结构

程序将从上到下执行代码,依次调用打印1、2、3、A、B、C的函数printf

顺序结构

现在,我们将这个代码改为分支结构。使用if关键词,配合if括号里面的表达式。若表达式结果为真,即执行if下面一条语句,否则跳过。若需要多条语句,使用花括号将多条语句组合成一条复合语句。

#include <stdio.h>

int main()
{   
    int n = 0;
    if (n == 1)
    {
        printf("111111\n");
        printf("222222\n");
        printf("333333\n");
    }

    printf("AAAAAA\n");
    printf("BBBBBB\n");
    printf("CCCCCC\n");

    return 0;
}

分支结构流程图

由于n的值为0,表达式n == 1的结果为假。所以,将跳过if下的一条语句,花括号内的函数printf将均不会执行。

分支流程

2. 预处理中的分支结构

2.1 #if

在程序中运用分支结构这个知识点我们已经学过了。但是,下面我们需要将分支结构运用在预处理中。

还是沿用之前程序分支结构中的if关键词。不过,由于现在我们需要的是预处理指令。所以,在if关键词前加一个#,即#if。现在,它从一个C语言关键词,变成了一个预处理指令了。#if后无需括号,直接填写条件表达式,并用空格隔开。

不同于if#if要求条件表达式为一个常量表达式。常量表达式中不允许出现变量。

由于预处理指令中不使用花括号,无法将多条语句组成一条复合语句,所以需要用#endif指令标记指令块结束。并且,就算#if下仅有一条语句,也需要使用#endif标记指令块结束

#include <stdio.h>

#define N 0

int main()
{  
#if N == 1   //  常量表达式,无需括号 
    printf("111111\n");
    printf("222222\n");
    printf("333333\n");
#endif      //  必须使用#endif标记指令块结束

    printf("AAAAAA\n");
    printf("BBBBBB\n");
    printf("CCCCCC\n");

    return 0;
}

分支流程

你肯定会有疑惑,为什么有了if关键词,还需要使用预处理指令#if呢?

下面我们将分析它们之间的差异。

预处理中的#if

预处理指令将在编译前,由预处理器处理。预处理器根据预处理指令的意图,修改代码。类似于#define指令,替换代码中出现的宏。#if指令会根据分支的走向,保留需要走向分支的代码,删除被跳过分支的代码。

关键词if:

编译后,程序运行时,计算条件表达式的结果。根据表达式结果,让程序走向不同的分支。

例如,上面那段代码经过预处理后,将被修改为如下代码:

#include <stdio.h>

int main()
{  
    printf("AAAAAA\n");
    printf("BBBBBB\n");
    printf("CCCCCC\n");

    return 0;
}