04.10 c#預處理器指令介紹

C#中有許多名為“預處理器指令”的命令。這些命令從來不會轉化為可執行代碼中的命令,但會影響編譯過程的各個方面。

例如,使用預處理器指令可以禁止編譯器編譯代碼的某一部分。如果計劃發佈兩個版本的代碼,即基本版本和擁有更多功能的企業版本,就可以使用這些預處理器指令。在編譯軟件的基本版本時,使用預處理器指令可以禁止編譯器編譯與額外功能相關的代碼。

另外,在編寫提供調試信息的代碼時,也可以使用預處理器指令。實際上,在銷售軟件時,一般不希望編譯這部分代碼。

預處理器指令的開頭都有符號#。

1. #define 和 #undef

#define 的用法如下所示: #define DEBUG

它告訴編譯器存在給定名稱的符號,在本例中是DEBUG。這有點類似於聲明一個變量,但這個變量並沒有真正的值,只是存在而已。

這個符號不是實際代碼的一部分,而只在編譯器編譯代碼時存在。在C#代碼中它沒有任何意義。

#undef 正好相反—— 它刪除符號的定義: #undef DEBUG

如果符號不存在,#undef 就沒有任何作用。同樣,如果符號已經存在,則#define 也不起作用。必須把#define 和#undef 命令放在C#源文件的開頭位置,在聲明要編譯的任何對象的代碼之前。

#define 本身並沒有什麼用,但與其他預處理器指令(特別是#if)結合使用時,它的功能就非常強大了。

這裡應注意一般C#語法的一些變化。預處理器指令不用分號結束,一般一行上只有一條命令。這是因為對於預處理器指令,C#不再要求命令使用分號進行分隔。如果它遇到一條預處理器指令,就會假定下一條命令在下一行上。

2. #if、#elif、#else 和#endif

  這些指令告訴編譯器是否要編譯某個代碼塊。考慮下面的方法:

int DoSomeWork(double x)

{

// do something

#if DEBUG

Console.WriteLine("x is " + x);

#endif

}

這段代碼會像往常那樣編譯,但Console.WriteLine 命令包含在#if 子句內。

這行代碼只有在前面的#define 命令定義了符號DEBUG 後才執行。

當編譯器遇到#if 語句後,將先檢查相關的符號是否存在,如果符號存在,就編譯#if 子句中的代碼。否則,編譯器會忽略所有的代碼,直到遇到匹配的#endif 指令為止。

一般是在調試時定義符號DEBUG,把與調試相關的代碼放在#if 子句中。在完成了調試後,就把#define 語句註釋掉,所有的調試代碼會奇蹟般地消失,可執行文件也會變小,最終用戶不會被這些調試信息弄糊塗(顯然,要做更多的測試,確保代碼在沒有定義DEBUG 的情況下也能工作)。

這項技術在C 和C++編程中十分常見,稱為條件編譯(conditional compilation)。

#elif (=else if)和#else 指令可以用在#if 塊中,其含義非常直觀。也可以嵌套#if 塊:

6. #pragma

  #pragma 指令可以抑制或還原指定的編譯警告。與命令行選項不同,#pragma 指令可以在類或方法級別執行,對抑制警告的內容和抑制的時間進行更精細的控制。

下面的例子禁止“字段未使用”警告,然後在編譯MyClass 類後還原該警告。


分享到:


相關文章: