条件编译指令的用法

312 阅读2分钟

这是我参与8月更文挑战的第24天,活动详情查看:8月更文挑战

介绍

 #if 和 #endif是一组同时使用的,叫做条件编译指令。
#if 与 #define、#include等指令一样是由预处理器这个强大的工具处理的,
预处理器可以在编译前处理c程序。

条件编译是根据实际定义宏(某类条件)进行代码静态编译的手段。可根据表达式的值或某个特定宏是否被定义来确定编译条件。

最常见的条件编译是防止重复包含头文件的宏,形式跟下面代码类似:

#ifndef LED_H
#define LED_H
#endif // #ifndef LED_H

条件编译中使用的预编译指令

#define            定义一个预处理宏
#undef             取消宏的定义
#if                  编译预处理中的条件命令,相当于C语法中的if语句
#ifdef              判断某个宏是否被定义,若已定义,执行随后的语句
#ifndef           与#ifdef相反,判断某个宏是否未被定义
#elif                若#if, #ifdef, #ifndef或前面的 #elif 条件不满足,则执行#elif之后的语句,相当于C语法中的else-if
#else              与#if, #ifdef, #ifndef对应, 若这些条件不满足,则执行#else之后的语句,相当于C语法中的else
#endif             #if, #ifdef, #ifndef这些条件命令的结束标志.
defined          与#if, #elif配合使用,判断某个宏是否被定义

预编译指令应用举例

1. #define、#undef

#define命令定义一个宏:

#undef可以取消宏定义,与#define对应。

2. defined

defined用来测试某个宏是否被定义。defined(name): 若宏被定义,则返回1,否则返回0。
它与#if、#elif、#else结合使用来判断宏是否被定义,defined可用于在一条判断语句中声明多个判别条件;#ifdef和#ifndef则仅支持判断一个宏是否定义。

#if defined(VAX) && defined(UNIX) && !defined(DEBUG)

和#if、#elif、#else不同,#ifdef、#ifndef、defined测试的宏可以是对象宏,也可以是函数宏。

实例讲解

#include <stdio.h>
#define class_1 0
#define class_2 1
int main()
{
#if class_1
printf("class_1\n");
#endif
#ifdef class_2
printf("class_2\n");
#endif
 
 return 0;
}

运行结果图

图片

可以明显看出,程序没有执行

#if        class_1
#endif

中的程序,这是因为,在程序的开头已经定义了class_1为0,而class_2为1,程序遇见

#if
#endif

只执行#if后面是1的程序段,而不执行后面是的程序段。
这就是条件编译指令的用法。