與C++不同,C#沒有獨立的預處理器。C#中的預處理指令(pre-processing directives)僅僅用來與C保持一致,而並不是編譯器開始編譯代碼之前的一個單獨的處理步驟,它是作為詞法解析的一部分來執行的。
預處理指令都以#號開頭並位於行首(前面可以出現空格符)。在介紹條件編譯之前,我們先學習兩條用於定義符號和取消符號定義的預處理指令:#define和#undef。
#define指令對於有一點C語言知識的讀者來說再熟悉不過,它非常類似於C中的宏定義:
#define COUNT
這裡定義了符號COUNT,它的作用域是該定義所在的整個文件。需要注意的是,符號定義必須放在所有其它語句的前面,或者說是放在所有“實代碼”(real code)的前面。所以下面的代碼是錯誤的:
using System
#define COUNT
再看一下例子:
#define A
namespace N
{
#define B
#if B
class Class1{}
#endif
}
由於在第二個#define指令之前出現了“實代碼”,因而是錯誤的。
然而,下面的代碼卻是合法的,因為#if是不“實代碼”:
#define A
#if A
#define B
#endif
namespace N
{
#if B
class Class1{}
#endif
}
有時候我們想在源程序中取消某個符號的定義,這時就要用到#undef指令:
#undef COUNT
與#define一樣,#undef的作用域也是定義所在的整個文件,它也必須出現在所有“實代碼”之前。下面的例子定義了一個符號,然後又取消了它,第二個#undef指令雖然不起任何作用,但卻是合法的:
#define A
#undef A
#undef A
好了,簡單地介紹了預處理語句之後,我們就可以來學習如何使用定義的符號進行條件編譯了。