C#中的预处理指令详解
目錄
1. #define 和 #undef
2. #if、#elif、#else 和#endif
3. #warning 和 #error
4. #region 和#endregion
5. #line
6. #pragma
C#中有許多名為“預(yù)處理指令”的命令。這些命令從來不會轉(zhuǎn)化為可執(zhí)行代碼中的命令,但會影響編譯過程的各個方面。
例如,使用預(yù)處理指令可以禁止編譯器編譯代碼的某一部分。如果計劃發(fā)布兩個版本的代碼,即基本版本和擁有更多功能的企業(yè)版本,就可以使用這些預(yù)處理指令。在編譯軟件的基本版本時,使用預(yù)處理指令可以禁止編譯器編譯與額外功能相關(guān)的代碼。
另外,在編寫提供調(diào)試信息的代碼時,也可以使用預(yù)處理指令。實際上,在銷售軟件時,一般不希望編譯這部分代碼。
預(yù)處理指令的開頭都有符號#。
C++開發(fā)人員應(yīng)知道,在C 和C++中預(yù)處理指令非常重要,但是,在C#中,并沒有那么多的預(yù)處理指令,它們的使用也不太頻繁。C#提供了其他機(jī)制來實現(xiàn)許多C++指令的功能,如定制特性。還要注意,C#并沒有一個像C++那樣的獨(dú)立預(yù)處理器,所謂的預(yù)處理指令實際上是由編譯器處理的。
盡管如此,C#仍保留了一些預(yù)處理指令名稱,因為這些命令會讓人覺得就是預(yù)處理器。
下面簡要介紹預(yù)處理指令的功能。
?
1. #define 和 #undef
#define 的用法如下所示: #define DEBUG
它告訴編譯器存在給定名稱的符號,在本例中是DEBUG。這有點(diǎn)類似于聲明一個變量,但這個變量并沒有真正的值,只是存在而已。
這個符號不是實際代碼的一部分,而只在編譯器編譯代碼時存在。在C#代碼中它沒有任何意義。
#undef 正好相反—— 它刪除符號的定義: #undef DEBUG
如果符號不存在,#undef 就沒有任何作用。同樣,如果符號已經(jīng)存在,則#define 也不起作用。必須把#define 和#undef 命令放在C#源文件的開頭位置,在聲明要編譯的任何對象的代碼之前。
#define 本身并沒有什么用,但與其他預(yù)處理器指令(特別是#if)結(jié)合使用時,它的功能就非常強(qiáng)大了。
這里應(yīng)注意一般C#語法的一些變化。預(yù)處理器指令不用分號結(jié)束,一般一行上只有一條命令。這是因為對于預(yù)處理器指令,C#不再要求命令使用分號進(jìn)行分隔。如果它遇到一條預(yù)處理器指令,就會假定下一條命令在下一行上。
2. #if、#elif、#else 和#endif
這些指令告訴編譯器是否要編譯某個代碼塊。考慮下面的方法:
?
復(fù)制代碼代碼如下:int DoSomeWork(double x)
{
? // do something
? #if DEBUG
? Console.WriteLine("x is " + x);
? #endif
}
?
這段代碼會像往常那樣編譯,但Console.WriteLine 命令包含在#if 子句內(nèi)。
這行代碼只有在前面的#define 命令定義了符號DEBUG 后才執(zhí)行。
當(dāng)編譯器遇到#if 語句后,將先檢查相關(guān)的符號是否存在,如果符號存在,就編譯#if 子句中的代碼。否則,編譯器會忽略所有的代碼,直到遇到匹配的#endif 指令為止。
一般是在調(diào)試時定義符號DEBUG,把與調(diào)試相關(guān)的代碼放在#if 子句中。在完成了調(diào)試后,就把#define 語句注釋掉,所有的調(diào)試代碼會奇跡般地消失,可執(zhí)行文件也會變小,最終用戶不會被這些調(diào)試信息弄糊涂(顯然,要做更多的測試,確保代碼在沒有定義DEBUG 的情況下也能工作)。
這項技術(shù)在C 和C++編程中十分常見,稱為條件編譯(conditional compilation)。
#elif (=else if)和#else 指令可以用在#if 塊中,其含義非常直觀。也可以嵌套#if 塊:
#line 164 "Core.cs" // We happen to know this is line 164 in the file // Core.cs, before the intermediate // package mangles it. // later on #line default // restores default line numbering6. #pragma
#pragma 指令可以抑制或還原指定的編譯警告。與命令行選項不同,#pragma 指令可以在類或方法級別執(zhí)行,對抑制警告的內(nèi)容和抑制的時間進(jìn)行更精細(xì)的控制。
下面的例子禁止“字段未使用”警告,然后在編譯MyClass 類后還原該警告。
#pragma warning disable 169 public class MyClass {int neverUsedField; } #pragma warning restore 169轉(zhuǎn)載于:https://www.cnblogs.com/dayang12525/p/6394318.html
總結(jié)
以上是生活随笔為你收集整理的C#中的预处理指令详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简述局域网与分布式系统异同点
- 下一篇: SQL Server-聚焦事务对本地变量