国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C# > 正文

C#中的預(yù)處理器指令詳解

2019-10-29 21:47:52
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
這篇文章主要介紹了C#中的預(yù)處理器指令詳解,本文講解了#define 和 #undef、#if、#elif、#else和#endif、#warning和#error、#region和#endregion、#line、#pragma等預(yù)處理器指令,需要的朋友可以參考下
 

目錄

1. #define 和 #undef
2. #if、#elif、#else 和#endif
3. #warning 和 #error
4. #region 和#endregion
5. #line
6. #pragma

  C#中有許多名為“預(yù)處理器指令”的命令。這些命令從來(lái)不會(huì)轉(zhuǎn)化為可執(zhí)行代碼中的命令,但會(huì)影響編譯過(guò)程的各個(gè)方面。

  例如,使用預(yù)處理器指令可以禁止編譯器編譯代碼的某一部分。如果計(jì)劃發(fā)布兩個(gè)版本的代碼,即基本版本和擁有更多功能的企業(yè)版本,就可以使用這些預(yù)處理器指令。在編譯軟件的基本版本時(shí),使用預(yù)處理器指令可以禁止編譯器編譯與額外功能相關(guān)的代碼。

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

  預(yù)處理器指令的開(kāi)頭都有符號(hào)#。

  C++開(kāi)發(fā)人員應(yīng)知道,在C 和C++中預(yù)處理器指令非常重要,但是,在C#中,并沒(méi)有那么多的預(yù)處理器指令,它們的使用也不太頻繁。C#提供了其他機(jī)制來(lái)實(shí)現(xiàn)許多C++指令的功能,如定制特性。還要注意,C#并沒(méi)有一個(gè)像C++那樣的獨(dú)立預(yù)處理器,所謂的預(yù)處理器指令實(shí)際上是由編譯器處理的。

  盡管如此,C#仍保留了一些預(yù)處理器指令名稱,因?yàn)檫@些命令會(huì)讓人覺(jué)得就是預(yù)處理器。

  下面簡(jiǎn)要介紹預(yù)處理器指令的功能。

 
1. #define 和 #undef

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

  它告訴編譯器存在給定名稱的符號(hào),在本例中是DEBUG。這有點(diǎn)類似于聲明一個(gè)變量,但這個(gè)變量并沒(méi)有真正的值,只是存在而已。

  這個(gè)符號(hào)不是實(shí)際代碼的一部分,而只在編譯器編譯代碼時(shí)存在。在C#代碼中它沒(méi)有任何意義。


  #undef 正好相反—— 它刪除符號(hào)的定義: #undef DEBUG

  如果符號(hào)不存在,#undef 就沒(méi)有任何作用。同樣,如果符號(hào)已經(jīng)存在,則#define 也不起作用。必須把#define 和#undef 命令放在C#源文件的開(kāi)頭位置,在聲明要編譯的任何對(duì)象的代碼之前。

  #define 本身并沒(méi)有什么用,但與其他預(yù)處理器指令(特別是#if)結(jié)合使用時(shí),它的功能就非常強(qiáng)大了。

  這里應(yīng)注意一般C#語(yǔ)法的一些變化。預(yù)處理器指令不用分號(hào)結(jié)束,一般一行上只有一條命令。這是因?yàn)閷?duì)于預(yù)處理器指令,C#不再要求命令使用分號(hào)進(jìn)行分隔。如果它遇到一條預(yù)處理器指令,就會(huì)假定下一條命令在下一行上。


2. #if、#elif、#else 和#endif
  這些指令告訴編譯器是否要編譯某個(gè)代碼塊。考慮下面的方法:

 

復(fù)制代碼代碼如下:

int DoSomeWork(double x)
{
  // do something
  #if DEBUG
  Console.WriteLine("x is " + x);
  #endif
}

 

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

  這行代碼只有在前面的#define 命令定義了符號(hào)DEBUG 后才執(zhí)行。

  當(dāng)編譯器遇到#if 語(yǔ)句后,將先檢查相關(guān)的符號(hào)是否存在,如果符號(hào)存在,就編譯#if 子句中的代碼。否則,編譯器會(huì)忽略所有的代碼,直到遇到匹配的#endif 指令為止。

  一般是在調(diào)試時(shí)定義符號(hào)DEBUG,把與調(diào)試相關(guān)的代碼放在#if 子句中。在完成了調(diào)試后,就把#define 語(yǔ)句注釋掉,所有的調(diào)試代碼會(huì)奇跡般地消失,可執(zhí)行文件也會(huì)變小,最終用戶不會(huì)被這些調(diào)試信息弄糊涂(顯然,要做更多的測(cè)試,確保代碼在沒(méi)有定義DEBUG 的情況下也能工作)。

  這項(xiàng)技術(shù)在C 和C++編程中十分常見(jiàn),稱為條件編譯(conditional compilation)。

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

 

復(fù)制代碼代碼如下:

#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#還通過(guò)Conditional 特性提供了另一種機(jī)制。

 

#if 和#elif 還支持一組邏輯運(yùn)算符“!”、“==”、“!=”和“||”。如果符號(hào)存在,就被認(rèn)為是true,否則為false,例如:

 

復(fù)制代碼代碼如下:

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

 

3. #warning 和 #error

  另兩個(gè)非常有用的預(yù)處理器指令是#warning 和#error,當(dāng)編譯器遇到它們時(shí),會(huì)分別產(chǎn)生警告或錯(cuò)誤。如果編譯器遇到#warning 指令,會(huì)給用戶顯示#warning 指令后面的文本,之后編譯繼續(xù)進(jìn)行。如果編譯器遇到#error 指令,就會(huì)給用戶顯示后面的文本,作為一條編譯錯(cuò)誤消息,然后會(huì)立即退出編譯,不會(huì)生成IL 代碼。

  使用這兩條指令可以檢查#define 語(yǔ)句是不是做錯(cuò)了什么事,使用#warning 語(yǔ)句可以提醒自己執(zhí)行某個(gè)操作:

 

復(fù)制代碼代碼如下:

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

 

4. #region 和#endregion
  #region 和#endregion 指令用于把一段代碼標(biāo)記為有給定名稱的一個(gè)塊,如下所示。

 

復(fù)制代碼代碼如下:

#region Member Field Declarations
int x;
double d;
Currency balance;
#endregion

 

  這看起來(lái)似乎沒(méi)有什么用,它不影響編譯過(guò)程。這些指令的優(yōu)點(diǎn)是它們可以被某些編輯器識(shí)別,包括Visual Studio .NET 編輯器。這些編輯器可以使用這些指令使代碼在屏幕上更好地布局。

5. #line
  #line 指令可以用于改變編譯器在警告和錯(cuò)誤信息中顯示的文件名和行號(hào)信息。這條指令用得并不多。

  如果編寫代碼時(shí),在把代碼發(fā)送給編譯器前,要使用某些軟件包改變輸入的代碼,就可以使用這個(gè)指令,因?yàn)檫@意味著編譯器報(bào)告的行號(hào)或文件名與文件中的行號(hào)或編輯的文件名不匹配。

  #line 指令可以用于還原這種匹配。也可以使用語(yǔ)法#line default 把行號(hào)還原為默認(rèn)的行號(hào):

 

復(fù)制代碼代碼如下:

#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 numbering

 

6. #pragma
  #pragma 指令可以抑制或還原指定的編譯警告。與命令行選項(xiàng)不同,#pragma 指令可以在類或方法級(jí)別執(zhí)行,對(duì)抑制警告的內(nèi)容和抑制的時(shí)間進(jìn)行更精細(xì)的控制。

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

 

復(fù)制代碼代碼如下:

#pragma warning disable 169
public class MyClass
{
  int neverUsedField;
}
#pragma warning restore 169

 

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


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 日喀则市| 桂林市| 西昌市| 雷波县| 临武县| 锦州市| 白朗县| 阜城县| 吉林市| 长宁区| 屏南县| 农安县| 吉木乃县| 务川| 花莲市| 平利县| 乡城县| 文成县| 固安县| 连平县| 宁安市| 景东| 宁海县| 钟祥市| 抚远县| 云浮市| 清苑县| 金湖县| 柘荣县| 武汉市| 海兴县| 克拉玛依市| 通许县| 景洪市| 疏勒县| 嘉禾县| 涟源市| 永寿县| 应用必备| 双桥区| 黄大仙区|