技术开发 频道

C#本质:预编译指令

        【IT168 技术文档】控制流语句中的条件表达式是在运行时求值的。而C#预处理指令是在编译时调用的。预处理器指令告诉C#编译器要编译哪些代码,并指出如何处理特定的错误和警告。C#预处理器还可以告诉C#编译器有关代码组织的信息。

  每个预处理指令都以一个#开头,而且必须在一行中写完。换行符(而不是分号)标志着预处理指令器指令的结束。

  排除和包含代码

  或许最常见的预处理器指令就是用于控制何时以及如何包含代码的指令。举个例子来说,要使代码能够同时由C#2.0和之前的C#1.2版本编译器进行编译,可以使用一个预处理器指令,在遇到1.2编译器的时候,就排除C#2.0特有的代码。

#if CSHARP2            System.Console.Clear();#endif

   在这个例子中,调用了System.Console.Clear()方法,这是只有2.0CLI才支持的方法。使用#if和#endif预处理器指令,这一行代码就只有在定义了预处理器符号CSHARP2的前提下才会编译。

  预处理器指令的另一个应用是处理不同平台之间的差异,比如用WINDOWS和LINUX #if指令将Windows和Linux特有的API包围起来。开发者经常用这些指令来取代多行注释(/*...*/),因为它们更容易定义恰当的符号或者通过一次搜索/替换来移除。预处理器指令最后一个常见的用途是调试。如果用一个#if DEBUG指令将调试代码包围起来,那么在大多数IDE中,都能在最终的发布版本中移除这些代码。IDE默认将DEBUG符号用于调试编译,将RELEASE符号用于发布版本。

  为了处理else-if条件,可以在#if指令中使用#elif指令,而不是创建两个完全独立的#if块

#if LINUX            ...#elif WINDOWS            ...#endif

   定义预处理器符号

  可以采取两种方式来定义预处理器符号。第一种方式是使用#define指令

#define CSHARP2

   第二种方式是在为.net编译的时候使用define选项,

  生成错误和警告

  有的时候,或许想要标记出代码中潜在的问题。为此,可以插入#error和#warning指令来分别生成一条错误或警告消息。

#warning "Same move allowed multiple times."

   包含#warning指令后,编译器会主动报告一条警告,利用这种警告,可以标记出代码中潜在的bug和可以提高的部分。它是提醒开发者任务尚未完结的好帮手。

  关闭警告消息

  警告可以指出代码中可能存在的问题,所以非常有用。然而,有的警告可以忽略,所以有必要关闭它们。C#2.0提供了预处理器指令#pragma来做到这一点

#pragma warning disable 1030

   注意,在编译器实际输出的时候,会在警告编号之前附加cs前缀。然而,在用#pragma禁用一个警告的时候,不需要添加这个前缀。

  要重新启用警告,仍然可以使用#pragma指令,只是要在warning之后添加一个restore选项

#pragma warning restore 1030

   上述两条指令正好可以将一个特定的代码块包围起来--前提是我们已知该警告不适用于这个代码块。

  我们最喜欢禁用的一个警告或许就是CS1591。如果使用doc编译器选项来生成XML文档,但是没有对程序中的所有public项进行文档化,就会显示该警告。

  nowarn:<warn list>选项

  除了#pragma指令,C#编译器通常还支持nowarn:<warn list>选项。它可以获得与#pragma相同的结果,只是不用把它加进源代码,而是把它作为一个编译器选项使用。除此之外,nowarn选项会影响整个编译过程,而#pragma指令只影响该指令所在的那个文件。

  指定行号

  利用#line指令可以改变C#编译器在报告错误或警告时显示的行号。这个指令主要是由能够自动生成C#代码的实用程序和设计器来使用。

#line 113 "TicTacToe.cs"#warning "Same move allowed multiple times."#line default

   在#line指令后添加一个default,会反转之前的所有#line的效果,并指示编译器报告真实的行号,而不是之前使用#line指定的行号。

0
相关文章