条件编译命令最主要还是在工程头文件中使用,主要是是属于硬件层的代码。

#if语句的语法结构

语法结构:

1
2
3
4
5
6
7
8
9
#if 表达式1
// 程序代码块1
#elif 表达式2
// 程序代码块2
#elif 表达式3
// 程序代码块3
#else
// 程序代码块4
#endif

注意表达式必须为一个整数型常量

#if 表达式1

若表达式1为真,则执行程序代码1;若为假,则不执行代码1 ,同时跳转到elif,去判断表达式2是否为真。若没有#elif,直接跳转到#else。若没有#else,直接跳转到#endif。

#elif 表达式2

若#if条件判断为假,则跳转到本语句,需要判断表达式2是否为真,若为真,则执行程序代码块2;若为假,则跳转到下面的语句继续判断。

#else

若以上的表达式皆假,则执行#else包含的程序代码块。

#endif

和#if是配套使用的,不能省略。

(#if-#elif-#else-#endif)代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>

#define OPTION 2

int main() {
#if OPTION == 1
printf("Option 1 is selected.\n");
#elif OPTION == 2
printf("Option 2 is selected.\n");
#elif OPTION == 3
printf("Option 3 is selected.\n");
#else
printf("No valid option is selected.\n");
#endif

return 0;
}

在这个示例中,#define OPTION 2 定义了一个名为 OPTION 的预处理宏,并将其设置为 2。然后,使用 #if、#elif 和 #else 来根据不同的选项编译不同的代码块。

根据 OPTION 的值,编译器会选择性地编译对应的代码块。在这个例子中,OPTION 的值是 2,所以编译器会编译 “Option 2 is selected.\n” 这行代码。

这个例子展示了如何使用条件预编译指令来在不同条件下编译不同的代码,从而实现灵活的代码控制。

#ifdef语句的语法结构

语法结构:

1
2
3
4
5
#ifdef 表达式
// 程序代码块1
#else
// 程序代码块2
#endif

#ifdef 表达式

表达式必须是一个宏定义变量。例如:#define NUM
如果表达式是宏定义的时候,则执行程序代码块1,否则跳转到#else所包含的程序代码块2。如果没有#else,则直接跳转到#endif。

#else

可以有,也可以省略。
若#else存在且#ifdef后的表达式不是宏定义时,执行程序代码块2。

#endif

和#ifdef是配套使用的,不能省略。

(#ifdef-#else-#endif)代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>

#define DEBUG // 注释掉这一行可以看到不同的输出

int main() {
#ifdef DEBUG
printf("Debug mode is enabled.\n");
#else
printf("Debug mode is not enabled.\n");
#endif

return 0;
}

在上面的示例中,#ifdef DEBUG 检查是否定义了名为 DEBUG 的预处理宏。由于我们在代码中定义了 #define DEBUG,所以编译器会编译位于 #ifdef 和 #else 之间的代码块,输出 “Debug mode is enabled.”。如果注释掉 #define DEBUG 这一行,编译器将会编译 #else 后的代码块,输出 “Debug mode is not enabled.”。

这个用法可以在编写调试相关代码时非常有用,可以根据是否启用了调试模式来选择性地输出调试信息。

#ifndef语句的语法结构

语法结构:

1
2
3
4
5
#ifndef 表达式
// 程序代码块1
#else
// 程序代码块2
#endif

使用方法:

与#ifdef语句作用类似,也是对宏定义作用。区别是#ifndef后的表达式不是宏定义时,才执行程序代码块1,与#ifdef语句恰恰相反。