導讀
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_Mode1 using 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
運行效果
本文完