C 中的預處理指令詳解

2022-01-23 17:07:48 字數 2351 閱讀 1614

這篇文章主要介紹了c#中的預處理指令詳解,本文講解了#define 和 #undef、#if、#elif、#else和#endif、#warning和#error、#region和#endregion、#line、#pragma等預處理指令,需要的朋友可以參考下

目錄

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

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

複製****如下:

int dosomework(double x)

這段**會像往常那樣編譯,但console.writeline 命令包含在#if 子句內。

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

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

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

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

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

// core.cs, before the intermediate

// package mangles it.

// later on

#line default // restores default line numbering

6. #pragma

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

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

#pragma warning disable 169

public class myclass

#pragma warning restore 169

VC中預處理指令的詳解

在所有的預處理指令中,pragma 指令可能是最複雜的了,它的作用是設定編譯器的狀態或者是指示編譯器完成一些特定的動作。pragma指令對每個編譯器給出了乙個方法,在保持與c和c 語言完全相容的情況下,給出主機或作業系統專有的特徵。依據定義,編譯指示是機器或作業系統專有的,且對於每個編譯器都是不同的...

C 中的預處理指令

c 中的預處理指令 作為預處理中的一對 region name endregion可能是大家使用得最多的,我也常用它來進行 分塊,在乙個比較長的cs檔案中,這麼做確實是一件可以讓你使 更清晰的好辦法,vs也自動用這個來包含自動生成的 它這麼做既可以使開發人員更清晰的檢視自己的 也開了乙個好頭,使更多...

pragma 預處理指令詳解

pragma 預處理指令詳解 在所有的預處理指令中,pragma 指令可能是最複雜的了,它的作用是設定編譯器的狀態或者是指示編譯器完成一些特定的動作。pragma指令對每個編譯器給出了乙個方法,在保持與c和c 語言完全相容的情況下,給出主機或作業系統專有的特徵。依據定義,編譯指示是機器或作業系統專有...