標籤:
導讀
1、什麼是預先處理
2、預先處理的好處
3、C#中的常見預先處理指令
4、總結
什麼是預先處理
在電腦科學中,預先處理通常是指利用某一程式(通常是前置處理器)對某一格式的源碼(如.cs C#原始碼)按照一些規則進行源碼替換的過程。這個過程發生在詞法分析階段,得到的仍然是源碼檔案。對於編譯而言簡單來講可分為三個階段,詞法分析、文法分析、可執行程式的產生。
上面是我自己的理解,可能不準確。PS我曾旁聽過中科大兩學期的編譯原理課,但都是因為某些原因工作加班等沒有一學期是堅持下去完整聽完的,真心慚愧
預先處理的好處
這個有什麼好處,我暫時還沒歸納出來。日後補上
C#中的常見預先處理指令
C#中常見預先處理指令可分為4類:
1、預先處理符號定義指令 #define 和 #undef
2、條件編譯指令 #if #elif #else #endif
3、診斷指令 #error 和 #warning
4、region 指令 #region #endregion
現在一一說明
預先處理定義符號
我們可以用 #define 定義預先處理符號,用 #undef 取消預先處理符號的定義,雖然編譯器提供了這樣的機制,但我不建議將預先處理符號定義寫在原始碼中,因為這樣就缺少變通性。C#編譯器提供了一個命令可以將預先處理符號的定義放在命令列參數中 csc /d:SybolName ..,推薦採用編譯器命令參數的形式定義預先處理符號
條件編譯指令
#if #elif #else #endif 和C#文法if-elseif else 的語義類似,這裡就不多說了。它支援 && || ! 登陸邏輯組合
我們看個例子 demo.cs
// #define Debug_Mode1 // 定義預先處理符號 Debug_Mode1// #undef Debug_Mode1 // 取消定義預先處理符號 Debug_Mode1using System;class App{ static void Main() { #if (Debug_Mode1 && !Debug_Mode2) // 只開啟 Debug_Mode1 Debug_Mode1(); #elif (!Debug_Mode1 && Debug_Mode2) // 只開啟 Debug_Mode2 Debug_Mode2(); #elif (Debug_Mode1 && Debug_Mode2) // 同時開啟 Debug_Mode1和Debug_Mode2 Debug_Mode1(); Debug_Mode2(); #else Console.WriteLine("正常運行"); #endif } #if(Debug_Mode1) static void Debug_Mode1() { Console.WriteLine("開啟Debug_Mode1模式"); } #endif #if(Debug_Mode2) static void Debug_Mode2() { Console.WriteLine("開啟Debug_Mode2模式"); } #endif}
編譯命令分別為
csc demo.cs
csc /d:Debug_Mode1 demo.cs
csc /d:Debug_Mode2 demo.cs
csc /d:Debug_Mode1,Debug_Mode2 demo.cs
運行效果分別為
診斷指令
格式
#error message
#waming message
message 可以是任何格式文本,比如中文
看代碼 diaDemo.cs
using System;#warning 編譯代碼前必須先Git代碼 如已經Git過代碼可無視class App{ static void Main() { DebugInvoke(); #if !Debug_Mode Console.WriteLine("正常運行"); #endif } static void DebugInvoke() { #if !Debug_Mode#error 這個方法只能在偵錯模式中使用#endif Console.WriteLine("現在進入偵錯模式..."); }}
編譯命令分別為
csc diaDemo.cs
csc /d:Debug_Mode diaDemo.cs
效果分別為
region 指令
這個指令我想用過C#的都應該熟悉,略去不表
總結
1、源檔案中的任何 #define 和 #undef 指令都必須出現在源檔案中的一個C#標識符前面,否則將出現編譯時間錯誤
2、不建議用#define 方式在原始碼中定義先行編譯符號,建議採用編譯器命令列參數的方式定義先行編譯符號
3、預先處理符號定義是在編譯時間指定不是運行時指定
看一個運行時指定運行參數的例子 demo2.cs
using System;class App{ static void Main(string[] args) { foreach(string arg in args) { Console.WriteLine(arg); } }}
編譯命令 csc demo2.cs
運行效果
本文完
C# 預先處理指令