条件编译伪指令
预处理器条件编译伪指令 使预处理器有条件地禁止编译部分源代码。 这些伪指令测试常量表达式或标识,以确定预处理器应该将哪些令牌传递给编译器,以及在预处理期间应该绕过哪些令牌。 这些伪指令是:
- #if 和 #elif 伪指令,根据常量表达式的结果有条件地包含或禁止源代码部分
- #ifdef 伪指令,它有条件地包含源文本 (如果定义了宏名称)
- #ifndef 伪指令,如果未定义宏名称,那么该伪指令有条件地包含源文本
- #else 伪指令,在先前的
#if,#ifdef,#ifndef或#elif测试失败时有条件地包含源文本 - #endif 伪指令,用于结束条件文本
预处理器条件编译伪指令跨几行:
- 条件规范行 (以
#if,#ifdef或#ifndef开头) - 包含预处理器传递给编译器的代码的行 (如果条件求值为非零值) (可选)
#elif行 (可选)- 包含预处理器传递给编译器的代码的行 (如果条件求值为非零值) (可选)
#else行 (可选)- 包含预处理器传递给编译器的代码的行 (如果条件求值为零) (可选)
- 预处理器
#endif伪指令
对于每个 #if, #ifdef和 #ifndef 伪指令,都有零个或多个 #elif 伪指令,零个或一个 #else 伪指令以及一个匹配的 #endif 伪指令。 所有匹配的伪指令都被视为处于同一嵌套级别。
可以嵌套条件编译伪指令。
#else(如果存在) 可以明确匹配,因为需要 #endif。#ifdef MACNAME
/* tokens added if MACNAME is defined */
# if TEST <=10
/* tokens added if MACNAME is defined and TEST <= 10 */
# else
/* tokens added if MACNAME is defined and TEST > 10 */
# endif
#else
/* tokens added if MACNAME is not defined */
#endif每个伪指令都控制紧跟其后的块。 块由在该伪指令之后的行上开始并在同一嵌套级别的下一个条件编译伪指令上结束的所有标记组成。
每个伪指令都按其迂到的顺序进行处理。 如果表达式求值为 0 ,那么将忽略伪指令后面的块。
当要忽略预处理器伪指令之后的块时,将仅检查令牌以识别该块中的预处理器伪指令,以便可以确定条件嵌套级别。 将忽略除伪指令名称以外的所有令牌。
仅处理表达式非零的第一个块。 将忽略该嵌套级别的其余块。 如果未处理该嵌套级别的任何块,并且存在 #else 伪指令,那么将处理 #else 伪指令之后的块。 如果未处理该嵌套级别的任何块,并且没有 #else 伪指令,那么将忽略整个嵌套级别。