C#前置處理器指令

來源:互聯網
上載者:User

標籤:

 

C#中的前置處理器指令

目錄

1. #define 和 #undef

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

3. #warning 和 #error

4. #region 和#endregion

5. #line

6. #pragma

 

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

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

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

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

 

  C++開發人員應知道,在C 和C++中前置處理器指令非常重要,但是,在C#中,並沒有那麼多的前置處理器指令,它們的使用也不太頻繁。C#提供了其他機制來實現許多C++指令的功能,如定製特性。還要注意,C#並沒有一個像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

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

1 int DoSomeWork(double x)2 {3   // do something4   #if DEBUG5   Console.WriteLine("x is " + x);6   #endif7 }

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

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

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

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

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

 

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

#define ENTERPRISE#define W2K// further on in the file#if ENTERPRISE// do something#if W2K// some code that is only relevant to enterprise// edition running on W2K#endif#elif PROFESSIONAL// do something else#else// code for the leaner version#endif

 

與C++中的情況不同,使用#if 不是有條件地編譯代碼的唯一方式,C#還通過Conditional 特性提供了另一種機制。

 

  #if 和#elif 還支援一組邏輯運算子“!”、“==”、“!=”和“||”。如果符號存在,就被認為是true,否則為false,例如:

1 #if W2K && (ENTERPRISE==false) // if W2K is defined but ENTERPRISE isn‘t

 

 

 

 

3. #warning 和 #error

  另兩個非常有用的前置處理器指令是#warning 和#error,當編譯器遇到它們時,會分別產生警告或錯誤。如果編譯器遇到#warning 指令,會給使用者顯示#warning 指令後面的文本,之後編譯繼續進行。如果編譯器遇到#error 指令,就會給使用者顯示後面的文本,作為一條編譯錯誤訊息,然後會立即退出編譯,不會產生IL 代碼。

  使用這兩條指令可以檢查#define 語句是不是做錯了什麼事,使用#warning 語句可以提醒自己執行某個操作:

1 #if DEBUG && RELEASE2 #error "You‘ve defined DEBUG and RELEASE simultaneously!"3 #endif4 #warning "Don‘t forget to remove this line before the boss tests the code!"5 Console.WriteLine("*I hate this job.*");

 

 

 

 

4. #region 和#endregion

  #region 和#endregion 指令用於把一段代碼標記為有給定名稱的一個塊,如下所示。

1 #region Member Field Declarations2 int x;3 double d;4 Currency balance;5 #endregion

  這看起來似乎沒有什麼用,它不影響編譯過程。這些指令的優點是它們可以被某些編輯器識別,包括Visual Studio .NET 編輯器。這些編輯器可以使用這些指令使代碼在螢幕上更好地布局。

 

 

 

 

 

5. #line

  #line 指令可以用於改變編譯器在警告和錯誤資訊中顯示的檔案名稱和行號資訊。這條指令用得並不多。

  如果編寫代碼時,在把代碼發送給編譯器前,要使用某些軟體包改變輸入的代碼,就可以使用這個指令,因為這意味著編譯器報告的行號或檔案名稱與檔案中的行號或編輯的檔案名稱不匹配。

  #line 指令可以用於還原這種匹配。也可以使用文法#line default 把行號還原為預設的行號:

1 #line 164 "Core.cs" // We happen to know this is line 164 in the file2 // Core.cs, before the intermediate3 // package mangles it.4 // later on5 #line default // restores default line numbering

 

 

 

 

6. #pragma

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

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

1 #pragma warning disable 1692 public class MyClass3 {4   int neverUsedField;5 }6 #pragma warning restore 169

 

 

感謝大家收看,謝謝親們了。

 

 

 

 

參考資料:《C#進階編程 第8版》

 

C#前置處理器指令

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.