23.2 观察一段示例
在开始讲每个具体预处理指令的用法以前,我们先来看一段示例代码,如代码清单23-1所示。在代码中,我们可以看到一些使用井号(#)开头的字符串,例如:#define,它们就是本章的主角——预处理指令,其后跟的DEBUG、SPECIAL称作“编译符号”(详见23.4节)。其中还有一些其他的预处理指令,如#if、#elif、#else等,这些指令的具体含义和用法会在相应章节进行介绍。
代码清单23-1 预处理指令示例代码
define DEBUG
define SPECIAL
using System;
namespace ProgrammingCSharp4
{
class Preprocessor
{
static void Main()
{
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
}
}
}
以上代码运行结果为:
DEBUG和SPECIAL符号已定义。
请按任意键继续……
从运行结果的效果来看,#if……#elif……#else……#endif似乎和条件语句(if{……}elseif{……}else{……})有些相似,但实际上是不同的。条件语句是在运行时控制代码的运行流程,而预处理指令是在编译时控制哪部分代码被编译,差别还是很大的。使用ILDasm工具查看一下生成的Preprocessor类的IL代码,便可清楚地看到这一点,如图23-1所示。
图 23-1 Preprocessor类的IL代码
可见,从编译生成的Preprocessor类的Main方法,我们只看到了一个对于Console.WriteLine方法的调用指令,这说明预处理指令只能对编译前的代码产生影响。一旦编译完毕,CIL代码就是确定了的。