C# 預處理指令


導讀

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

運行效果分別為

image

image

image

image

 

診斷指令

格式
#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

效果分別為

image

image

 

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

運行效果

image

 

本文完


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM