#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
指令之间的代码。