23.5 条件编译指令

定义好了编译符号就可以根据符号的状态来控制编译过程了,条件编译指令非常灵活,功能近似于条件语句,只是使用场景不同。

条件编译指令包括如下指令:

❑#if

❑#elif

❑#else

❑#endif

其中#if和#elif后跟一个表达式,根据表达式的返回值(true或者false)来决定编译还是跳过相应的代码,该表达式可以为:

❑编译符号:如果编译符号已定义,则返回true,否则返回false。

❑使用运算符(==、!=、!、&&、||、())连接多个编译符号,返回表达式的运算结果(true或者false)。

另外需要说明的是,每个#if指令都必须有与之相配的#endif指令。使用这些条件编译指令的结构有4种,如图23-2所示。

23.5 条件编译指令 - 图1

图 23-2 条件编译指令的结构图

这4种结构分别是:

❑#if……#endif结构

如果表达式的结果为true则编译中间的代码块,否则跳过。例如:


if(DEBUG&&!SPECIAL)

Console.WriteLine(“DEBUG符号已定义。”);

endif


❑#if……#else……#endif结构

如果表达式的结果为true则编译“代码块1”,否则编译“代码块2”。例如:


if(DEBUG&&!SPECIAL)

Console.WriteLine(“DEBUG符号已定义。”);

else

Console.WriteLine(“DEBUG和SPECIAL符号没有定义。”);

endif


❑#if……#elif……#endif结构

如果“表达式1”的结果为true则编译“代码块1”,否则继续判断“表达式2”的结果,如果为true则编译“代码块2”……依此类推,直到“表达式n”的结果为true,则编译“代码块n”,如果所有表达式都为false,则编译,最后退出该条件结构。例如:


if(DEBUG&&!SPECIAL)

Console.WriteLine(“DEBUG符号已定义。”);

elif(!DEBUG&&SPECIAL)

Console.WriteLine(“SPECIAL符号已定义。”);

elif(DEBUG&&SPECIAL)

Console.WriteLine(“DEBUG和SPECIAL符号已定义。”);

endif


❑#if……#elif……#else……#endif结构

如果“表达式1”的结果为true,则编译“代码块1”,否则继续判断“表达式2”的结果;如果为true,则编译“代码块2”……依此类推,直到“表达式3”的结果为true,则编译“代码块3”。如果所有表达式的结果都为false,则编译#else之后的“代码块4”。例如:


if(DEBUG&&!SPECIAL)

Console.WriteLine(“DEBUG符号已定义。”);

elif(!DEBUG&&SPECIAL)

Console.WriteLine(“SPECIAL符号已定义。”);

elif(DEBUG&&SPECIAL)

Console.WriteLine(“DEBUG和SPECIAL符号已定义。”);

else

Console.WriteLine(“DEBUG和SPECIAL符号没有定义。”);

endif


完整示例请参考代码清单23-1。