23.5 条件编译指令
定义好了编译符号就可以根据符号的状态来控制编译过程了,条件编译指令非常灵活,功能近似于条件语句,只是使用场景不同。
条件编译指令包括如下指令:
❑#if
❑#elif
❑#else
❑#endif
其中#if和#elif后跟一个表达式,根据表达式的返回值(true或者false)来决定编译还是跳过相应的代码,该表达式可以为:
❑编译符号:如果编译符号已定义,则返回true,否则返回false。
❑使用运算符(==、!=、!、&&、||、())连接多个编译符号,返回表达式的运算结果(true或者false)。
另外需要说明的是,每个#if指令都必须有与之相配的#endif指令。使用这些条件编译指令的结构有4种,如图23-2所示。
图 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。