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.2 观察一段示例 - 图1

图 23-1 Preprocessor类的IL代码

可见,从编译生成的Preprocessor类的Main方法,我们只看到了一个对于Console.WriteLine方法的调用指令,这说明预处理指令只能对编译前的代码产生影响。一旦编译完毕,CIL代码就是确定了的。