亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#中的預處理器指令詳解

2020-01-24 02:12:33
字體:
來源:轉載
供稿:網友

目錄

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)
{
  // do something
  #if DEBUG
  Console.WriteLine("x is " + x);
  #endif
}

  這段代碼會像往常那樣編譯,但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,例如:

復制代碼 代碼如下:

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

3. #warning 和 #error

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

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

復制代碼 代碼如下:

#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 指令用于把一段代碼標記為有給定名稱的一個塊,如下所示。

復制代碼 代碼如下:

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

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

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

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

  #line 指令可以用于還原這種匹配。也可以使用語法#line default 把行號還原為默認的行號:

復制代碼 代碼如下:

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

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

復制代碼 代碼如下:

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品在线观看网站| 精品免费在线观看| 久久精品最新地址| 欧美激情在线视频二区| 欧美视频13p| 国产精品久久久久影院日本| 日韩a**站在线观看| 欧美亚洲在线播放| 日韩av大片在线| xxxx性欧美| 国产色视频一区| 国产精品免费看久久久香蕉| 欧美又大又硬又粗bbbbb| 国产成人av在线| 国产脚交av在线一区二区| 国产精品老女人视频| 精品一区二区三区电影| 97av在线视频免费播放| 国产精品高潮呻吟久久av黑人| 亚洲欧美日韩精品久久奇米色影视| 国产综合香蕉五月婷在线| 欧美在线精品免播放器视频| 第一福利永久视频精品| 亚洲国产精品99| 亚洲偷欧美偷国内偷| 在线观看欧美日韩| 日韩福利在线播放| 精品久久在线播放| 国产在线精品一区免费香蕉| 久久精品人人爽| 日韩欧美高清在线视频| 中文字幕日韩在线视频| 日韩中文字幕在线免费观看| 久久在线视频在线| 亚洲精品一区二区久| 亚洲欧美日韩久久久久久| 国产精品久久久久久久久久| 日韩av免费在线观看| 色综合久久精品亚洲国产| 成人福利免费观看| 国产精品成人一区二区| 精品视频—区二区三区免费| 亚洲国产天堂久久综合网| 日韩精品久久久久久久玫瑰园| 97香蕉久久夜色精品国产| 午夜欧美大片免费观看| 中文字幕精品—区二区| 97视频在线观看免费高清完整版在线观看| 欧美日韩精品在线观看| 欧美黑人狂野猛交老妇| 欧美激情区在线播放| 久久精品亚洲精品| 久久亚洲精品一区二区| 久久久久久久久久久成人| 日韩欧美国产黄色| 国产精品永久免费观看| 国产精品成人va在线观看| 国产精品入口福利| 精品国产91久久久| 全亚洲最色的网站在线观看| 黄色成人av网| 亚洲毛片一区二区| 久久九九国产精品怡红院| 成人免费视频xnxx.com| 欧美性少妇18aaaa视频| 国产美女被下药99| 91在线国产电影| 国产女人18毛片水18精品| 亚洲电影第1页| 777国产偷窥盗摄精品视频| 日韩电影网在线| 精品亚洲永久免费精品| 免费91在线视频| 欧美日韩一区二区免费视频| 国产精品网站大全| 午夜精品久久久久久久99热| 国产精品大片wwwwww| 在线电影中文日韩| 97视频人免费观看| 久久久国产视频91| 正在播放欧美视频| 国产精品国产亚洲伊人久久| 国产精品久久久一区| 国产精品成人在线| 亚洲毛茸茸少妇高潮呻吟| 国内免费久久久久久久久久久| 亚洲高清久久久久久| 欧美午夜精品久久久久久久| 国产精品视频xxxx| 成人免费xxxxx在线观看| 日韩中文在线视频| 亚洲成人av资源网| 青青精品视频播放| 久久久国产精品亚洲一区| 国产精品最新在线观看| 国产欧美精品va在线观看| 国精产品一区一区三区有限在线| 疯狂蹂躏欧美一区二区精品| 久久久精品视频成人| 国产精品日韩av| 欧美日韩中文字幕在线视频| 国产99久久精品一区二区永久免费| 精品国产91久久久久久老师| 成人欧美在线视频| 欧美黑人xxxⅹ高潮交| 欧美成人午夜激情在线| 欧美激情按摩在线| 国产v综合ⅴ日韩v欧美大片| 欧美激情精品久久久久久大尺度| 国产精品白嫩初高中害羞小美女| 欧美极品少妇xxxxⅹ免费视频| 国产精品三级网站| 美女久久久久久久| 日韩中文字幕在线观看| 欧美日韩国产一中文字不卡| 日本午夜精品理论片a级appf发布| 日韩天堂在线视频| 国产精品91在线观看| 成人免费视频在线观看超级碰| 欧美高清在线播放| 国产精品99一区| 欧美一级片一区| 久久成人综合视频| 精品久久久一区二区| 日韩成人中文字幕在线观看| 国产最新精品视频| 国产精品一区二区三区免费视频| 美女999久久久精品视频| 亚洲free嫩bbb| 欧美最猛性xxxxx亚洲精品| 国产欧美精品va在线观看| 成人情趣片在线观看免费| 91美女福利视频高清| 91精品91久久久久久| 欧美成人中文字幕在线| 97国产精品久久| 午夜精品久久久久久久久久久久久| 91免费在线视频| 91在线免费看网站| 久久福利视频网| 欧美做爰性生交视频| 日韩精品在线免费观看视频| 国模精品视频一区二区| 久久99久国产精品黄毛片入口| 91福利视频在线观看| 日本一本a高清免费不卡| 亚洲美女视频网| 在线观看久久久久久| 中文字幕日韩在线播放| 日韩国产高清污视频在线观看| 97久久久久久| 91香蕉亚洲精品| 国产国语刺激对白av不卡| 欧美日韩一二三四五区| 亚洲成人动漫在线播放| 久久免费精品日本久久中文字幕| 日韩亚洲成人av在线| 国产日韩欧美在线视频观看| 亚洲的天堂在线中文字幕| 国产视频精品一区二区三区| 91热精品视频| 91麻豆桃色免费看| 亚洲香蕉成视频在线观看| 国内精品一区二区三区|