C 條件編譯

2022-08-05 08:51:17 字數 3480 閱讀 1946

c#的預處理器指令從來不會轉化為可執行**的命令,但是會影響編譯過程的各個方面,常用的預處理器指令有#define、#undef、#if,#elif,#else和#endif等等,下面介紹c#中使用#define進行條件編譯的例項。

c#中條件編譯指令用於按條件包含或排除原始檔中的某些部分。在visual studio中,會看到被排除的**顯示為灰色。

一、#define可以用來做什麼

1、當計畫發布兩個版本的**的時候。即基本版和擁有更多版本的企業版,就可以用到條件編譯指令;

2、例如同乙個檔案給silverlight、wpf、winform等使用,並且還考慮debug和release等,有大部分**是一樣的;

3、指定函式和屬性是否編譯到最終產品中去。

二、#define用法

語法:#define 名稱

注意:這裡名稱取debug,你也可以取其他名稱如dragon

#define debug
說明:1、debug可以看做是宣告的乙個變數,但此變數沒有真正的值,存在時#if debug結果為true,否則為false;

2、#define單獨用沒什麼意義,一般是和#if或者conditional特性結合使用;

3、#define必須定義在所有using命名空間前面;

4、debugdebug是不同的,c#區分大小寫。

三、#define條件編譯例項

方式

一、使用#if

#define dragon

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.diagnostics;

namespace

conditionalcompilation}}

輸出結果如下:

如果注釋掉

//

#define dragon

輸出結果為:

方式

二、使用conditional特性

我們可以將一些函式隔離出來,使得它們只有在定義了某些環境變數或者設定了某個值之後才能發揮作用,使用conditional特性的隔離策略要比#if/#endif不容易出錯。

#define debug

#define trace

#if (debug && trace)

#define debugandtrace

#endif

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.diagnostics;

namespace

conditionalcompilation

[conditional(

"debug")]

static

void

print0()

[conditional(

"debug")]

static

void

print1()

//定義了debug或者trace後才會執行此方法

//或者的關係

[conditional("

debug

"), conditional("

trace")]

static

void

print2()

//只有定義了debug和trace後才會執行此方法

//並且的關係

[conditional("

debugandtrace")]

static

void

print3()}}

輸出結果如下:

說明:1、**中沒有定義debug,卻輸出了debug,是因為debug版本,自動定義了debug。「專案——右鍵——屬性——生成選項卡——常規欄」下的定義 debug 常量(u)前面的核取方塊被選中。當然你可以去掉其選中狀態,這樣就不會輸出debug了。

2、如果debug和trace均沒有定義,則不會輸出debug or trace;只有debug和trace均定義了,才會輸出debug and trace。

3、可以給conditional增加多個屬性如示例**

[conditional("

debug

"), conditional("

trace

")]

不過多個屬性之間的關係是或的關係,即「debug」或者「trace」任意乙個被定義了,那麼對應方法就會被執行。

4、如果需要增加多個與的屬性,直接用conditional是無法實現的,需要借助#if/#endif間接來完成,如示例**中的組合操作

#if (debug && trace)

#define debugandtrace

#endif

使用conditional屬性的方法受到以下限制:1、條件方法必須是類宣告或結構宣告中的方法。如果在介面宣告中的方法上指定conditional屬性,將出現編譯時錯誤;

2、條件方法不能是介面方法的實現。否則將發生編譯時錯誤;

3、條件方法必須具有void返回型別;

4、不能用override修飾符標記條件方法。但是,可以用virtual修飾符標記條件方法。此類方法的重寫方法隱含為有條件的方法,而且不能用conditional屬性顯式標記。

環境變數(或條件編譯符號)的設定方法有三:

1)用#define定義以及#undef取消定義,在所有using命名空間前面定義;

2)用編譯器命令列選項(例如,/define:debug),在「專案——右鍵——屬性——生成選項卡——常規欄」下的條件編譯符號(y)中設定(如果多個,可以用英文逗號隔開)。debug版本下,系統預設設定了debug和trace;

3)用作業系統外殼程式中的環境變數(例如,set debug=1)。

C 條件編譯

條件編譯 按照不同的編譯條件去編譯不同的程式 從而使乙個源程式在不同的編譯條件下生成不同的目標程式。c 提供幾種條件編譯指令,以乙個表示式或者某個巨集是否被定義的條件作為編譯條件。指令 用途 空指令,無任何效果 include 包含乙個源 檔案 define 定義巨集 undef 取消已定義的巨集 ...

C 條件編譯

一 條件編譯方法 1 if,elif,else,endif 使用條件編譯指令,如果滿足 if後面的條件,就編譯 if和 endif之間的程式段,否則不編譯。二 編譯此段 時是否有某個巨集通過 ifdef,else,endif或 ifndef,else,endif 如果乙個c源程式在不同計算機系統上執...

C條件編譯

在 c 語言中,條件編譯指令可以實現源 的部分編譯功能,可以根據表示式的值或者某個特定的巨集來確定編譯條件,以決定編譯哪些 不編譯哪些。在 c 語言中,乙個檔案中可以包含多個標頭檔案,而標頭檔案之間又是可以相互引用的,這將引起乙個檔案中可能間接多次包含某個標頭檔案,從而導致了某些標頭檔案被重複引用多...