C语言--条件编译(常见的编译指令)

文章介绍了C/C++编程中条件编译指令如#ifdef,#ifndef,#elif以及它们在根据不同操作系统和宏定义选择性执行代码块的应用,展示了如何根据操作系统类型和宏存在与否来控制代码的编译行为。
摘要由CSDN通过智能技术生成

#if(开始(判断条件))+#endif(结束)

条件满足就参与编译,这里是一个判断的语句,当M大于0的时候,打印hehe不然就不打印

或者注释代码也好用

当#if 0的时候 ,也就是大规模的注释代码使用

当然结尾需要加上#endif

———————————————————————————————————————————

 #endif(结束)

条件编译指令都需要#endif来结束

———————————————————————————————————————————

#if defined(判断是否已经被定义,定义了就执行)+#endif(结束)

如果没有定义#define max 那就不打印

如果定义了#define max 那就打印

#if defined(MAX)
// 如果 MAX 已经被定义,则执行这里的代码
printf("hehe\n");
#endif

———————————————————————————————————————————

 #if !defined(判断是否未被定义,未定义执行)+#endif(结束)

#if !defined(MAX)
// 如果 MAX 未定义,则执行这里的代码
printf("hehe\n");
#endif

———————————————————————————————————————————

条件编译的嵌套使用


#if defined(OS_UNIX)
 #ifdef OPTION1
 unix_version_option1();
 #endif
 #ifdef OPTION2
 unix_version_option2();
 #endif
#elif defined(OS_MSDOS)
 #ifdef OPTION2
 msdos_version_option2();
 #endif
#endif


这段代码是使用条件编译来根据不同的操作系统定义来执行不同的代码块。这里的 `OS_UNIX` 和 `OS_MSDOS` 是用来表示不同操作系统的宏,而 `OPTION1` 和 `OPTION2` 可能是与特定操作系统相关的其他宏。
让我们逐行解释代码:
```c
#if defined(OS_UNIX)
```
这行代码检查 `OS_UNIX` 是否被定义。如果当前编译的操作系统是 Unix(包括类Unix系统如Linux、BSD等),那么接下来的代码块会被编译和执行。
```c
 #ifdef OPTION1
 unix_version_option1();
 #endif
```
这段代码首先检查 `OPTION1` 是否被定义。如果在 `OS_UNIX` 定义的文件中定义了 `OPTION1`,那么 `unix_version_option1();` 这行代码会被编译和执行。`OPTION1` 可能是特定于Unix系统的功能或配置选项。
```c
 #ifdef OPTION2
 unix_version_option2();
 #endif
```
这段代码与上一段类似,但它检查 `OPTION2` 是否被定义。如果在 `OS_UNIX` 定义的文件中定义了 `OPTION2`,那么 `unix_version_option2();` 这行代码会被编译和执行。这允许特定于Unix系统的不同选项可以根据需要启用或禁用。
```c
#elif defined(OS_MSDOS)
```
这行代码是 `#if` 的备用分支,用于检查 `OS_MSDOS` 是否被定义。如果当前编译的操作系统是 MS-DOS 或其他兼容系统,那么 `#elif` 块中的代码会被编译和执行。
```c
 #ifdef OPTION2
 msdos_version_option2();
 #endif
```
这段代码与之前解释的类似,但它是在 `OS_MSDOS` 定义的情况下使用的。它检查 `OPTION2` 是否被定义,如果在 `OS_MSDOS` 定义的文件中定义了 `OPTION2`,那么 `msdos_version_option2();` 这行代码会被编译和执行。这允许特定于MS-DOS系统的不同选项可以根据需要启用或禁用。
```c
#endif
```
这行代码标记了条件编译块的结束。
总结一下,这段代码允许根据当前编译的操作系统选择性地编译和执行特定的功能。如果操作系统是Unix,则执行与 `OPTION1` 和 `OPTION2` 相关的代码。如果操作系统是MS-DOS,则只执行与 `OPTION2` 相关的代码。如果操作系统既不是Unix也不是MS-DOS,那么整个代码块将被忽略。

———————————————————————————————————————————

#ifdef(定义了宏继续运行)+ #endif(结束)

#ifndef(没有定义宏则继续运行)+ #endif(结束)

在宏定义里面,我们有时候会定义的宏过多导致不知道宏是否已经定义了。所以我们可以·

- `#ifdef` 检查是否定义了某个宏,如果定义了,则编译后续的代码块。
- `#ifndef` 检查是否没有定义某个宏,如果没有定义,则编译后续的代码块。

下面是如何使用这些指令的例子:

```c
#ifdef MAX
// 如果 MAX 已经被定义,则编译这里的代码
printf("MAX is defined.\n");
#endif


#ifndef MAX
// 如果 MAX 没有被定义,则编译这里的代码
printf("MAX is not defined.\n");
#endif
```


在第一个 `#ifdef MAX` 指令之后,预处理器会检查 `MAX` 是否已经被定义。如果 `MAX` 已经被定义(比如通过 `#define MAX 10`),那么 `printf("MAX is defined.\n");` 这行代码会被编译和执行。如果 `MAX` 没有被定义,预处理器会忽略整个 `#ifdef` 和随后的 `#endif` 指令之间的代码块。
在第二个 `#ifndef MAX` 指令之后,预处理器会检查 `MAX` 是否没有被定义。如果 `MAX` 没有被定义,那么 `printf("MAX is not defined.\n");` 这行代码会被编译和执行。如果 `MAX` 已经被定义,预处理器会忽略整个 `#ifndef` 和随后的 `#endif` 指令之间的代码块。
这些指令通常用于条件编译外部头文件,或者在不同的编译环境中编译相同的代码,以避免重复包含和潜在的冲突。

#ifdef和#ifndef 总结

  • #ifdef 指令检查是否已经定义了某个宏。如果该宏已定义,则执行 #ifdef 和相应的 #endif 指令之间的代码。
  • #ifndef 指令检查是否没有定义某个宏。如果没有定义该宏,则执行 #ifndef 和相应的 #endif 指令之间的代码。
  • 26
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值