預處理指令

發表於2015-12-24

C#預處理指令基本概念

雖然同C和C++的術語“預處理指令”名稱一樣,但C#的其實並沒有單獨的預處理步驟,也就是說在VS等環境中並沒有預處理的編譯器。

預處理指令能夠用於替換原始檔中的資訊。以#(Sharp)字元和預處理指令名稱開頭。例如:

#define MAX

習慣於將預處理指令的名稱全部設為大寫。和C與C++不同的是,C#中的預處理指令的名稱後不加數字等。C\C++所支援的巨集函式在C#中也是不支援的。

還可以使用#region來設定一個區域,同時也可以通過Visual Studio讓程式碼摺疊。往往在#region後加上該區域的名稱的字串,可以實現註釋的作用。

#region C#預處理指令
#endregion

5個預處理指令

1.#undef

上面我們使用了#define,其實還是有#undef的。那麼它又是做什麼的呢?

#define MAX
static void Main(string[] args)  
{
    #if (MAX)  
       Console.WriteLine("MAX已經定義了。");
    #endif
}

如果我們Debug程式,就會在控制檯看到這樣一條:

MAX已經定義了。

如果我們Release程式,得到的結果也還是一樣的,但是如果在程式碼開頭加上:

#undef MAX

再來Debug控制檯就不會有訊息提示了。

2.#if、#else、#elif

如果想要控制檯顯示MAX沒有定義的情況,那就用#else來搭配#if就可以了。

#if (MAX) 
    Console.WriteLine("MAX已經定義了。");
#else     
    Console.WriteLine("MAX還沒有定義。");
#endif

或許你在鍵入#else的時候也看到了#elif,這個自然就是對應的else if了。它們的邏輯和常規的if套裝是一樣的。

#define MAX
#undef MAX
#define MIN

static void Main(string[] args)   
{
#if (MAX)  
     Console.WriteLine("MAX已經定義了。");
#elif (MIN)   
     Console.WriteLine("MIN已經定義了。");
#else           
     Console.WriteLine("MAX還沒有定義。");
#endif          
     Console.ReadLine();        
}

3.#warning、#error

這兩個預處理指令用於丟擲異常和錯誤。

#warning 這是一個強制丟擲的異常。

這裡寫圖片描述

#error 這是一個強制丟擲的錯誤。

這裡寫圖片描述

4.#line

我們還可以用#line將以下#error這行程式碼的行數設定為10000行,並將檔名設定為”錯誤“。

static void Main(string[] args)     
{
#line 10000 "錯誤"
#error 這是一個強制丟擲的錯誤。  
}

這裡寫圖片描述

如果我們再新增這樣一行程式碼,則會將行數和檔名恢復為預設的。

#line 10000 "Error"
#error 這是一個強制丟擲的錯誤。
#line default
#warning 這是一個強制丟擲的警告。

這裡寫圖片描述

5.#pragma

我們先在Program類前加上這樣一行程式碼,它會引發CS3021錯誤。

 [CLSCompliant(false)]    

然後我們在上面這行程式碼前加入以下這行程式碼,其作用是禁用warning 3021。那麼再次Debug就會發現原本的錯誤已經不在了。

#pragma warning disable 3021    

如果想要在後文中恢復這個CS3021錯誤,就用restore即可。

#pragma warning restore 3021    

以下是完整程式碼。

#pragma warning disable 3021    
  [CLSCompliant(false)]    
  class Program    
  {                             
      static void Main(string[] args)        
      {}
  }
#pragma warning restore 3021    
  [CLSCompliant(false)]    
  public class OtherProgram    
  {                            
      public static void OtherMain()        
      {}
  }

這個預處理指令其實是非常複雜的,在各大百科上已經有了相關介紹,以下是維基百科上的。傳送門:pragma once



感謝訪問,希望對您有所幫助。 歡迎關注或收藏、評論或點贊。


為使本文得到斧正和提問,轉載請註明出處:
http://blog.csdn.net/nomasp


相關文章