C 語言的預處理器指令

2022-02-26 16:51:59 字數 4743 閱讀 6803

c# 語言的預處理器指令:

一、#if

#if 使您可以開始條件指令,測試乙個或多個符號以檢視它們是否計算為 true。如果它們的計算結果確實為 true,則編譯器將計算位於 #if 與最近的 #endif 指令之間的所有**。以 #if 指令開始的條件指令必須用 #endif 指令顯式終止。例如:

#define debug

// ...

#if debug

console.writeline("debug version");

#endif

可以使用運算子 ==(相等)、!=(不相等)、&&(與)及 ||(或)來計算多個符號。還可以用括號將符號和運算子分組。

備註:

使用 #if 以及 #else、#elif、#endif、#define 和 #undef 指令,可以包括或排除基於由乙個或多個符號組成的條件的**。這在編譯除錯版本的**或編譯特定配置時最為有用。

二、#else

#else 允許您建立復合條件指令,因此,如果前面的 #if 或(可選)#elif 指令中的任何表示式都不為 true,則編譯器將計算 #else 與後面的 #endif 之間的所有**。

三、#elif

使您得以建立復合條件指令。如果前面的 #if 和前面的任何 #elif(可選)指令表示式的計算結果都不是 true,則將計算 #elif 表示式。如果 #elif 表示式計算為 true,編譯器將計算位於 #elif 和下乙個條件指令之間的所有**。

三、#endif

#endif 指定以 #if 指令開頭的條件指令的結尾。

四、#define

使用 #define 可以定義乙個符號,並通過將該符號用作表示式傳遞給 #if 指令,使該表示式的計算結果為 true。可以定義符號,但是無法對符號賦值。例如:

# define debug

符號可用於指定編譯的條件。可以使用 #if 或 #elif 來測試符號。還可以使用 conditional 屬性執行條件編譯。

也可以用 /define 編譯器選項來定義符號。可以用 #undef 來取消定義符號。 用 #define 建立的符號的範圍是在其中定義該符號的檔案。

備註:與c/c++不一樣,c#的#define語句僅允許你在符號表中插乙個標籤,但你不能給任何乙個符號賦乙個值。與c/c++另乙個不同的地方,c/c++允許#define預處理器指令出現在任何所需的地方,而在使用任何非預處理器指令的指令前,c#的#define指令必須出現在乙個檔案中。用#define定義的標籤不會與同名的變數衝突。這就是說,乙個變數名不應該傳遞給預處理器指令,而且符號只能通過預處理器指令來求值。插入到符號表中的標籤的作用域就是定義它的檔案。可以用#undef取消符號定義。

五、#undef

#undef 使您可以取消符號的定義,以便通過將該符號用作 #if 指令中的表示式,使表示式的計算結果為 false。

六、#warning

#warning 使您得以從**的特定位置生成一級警告。例如:

#warning deprecated code in this method.

備註:

#warning 通常用在條件指令中。也可以用 #error(c# 參考)生成使用者定義的錯誤。

示例// preprocessor_warning.cs

// cs1030 expected

#define debug

class mainclass

}七、#error

#error 使您可以從**中的特定位置生成錯誤。例如:

#error deprecated code in this method.

八、#line

#line 使您可以修改編譯器的行號以及(可選)錯誤和警告的檔名輸出。下面的示例說明如何報告與行號關聯的兩個警告。#line 200 指令強迫行號為 200(儘管預設值為 #7)。另一行 (#9) 作為預設 #line 指令的結果跟在通常序列後。

class mainclass

}備註:

#line 指令可能由生成過程中的自動中間步驟使用。例如,如果行從原始的源**檔案中移除,但是您仍希望編譯器基於檔案中的原始行號生成輸出,則可以移除行,然後用 #line 模擬原始行號。 #line hidden 指令對偵錯程式隱藏若干連續的行,這樣當開發人員在逐句通過**時,將會跳過 #line hidden 和下乙個 #line 指令(假定它不是另乙個 #line hidden 指令)之間的所有行。此選項也可用來使 asp.net 能夠區分使用者定義的**和計算機生成的**。儘管 asp.net 是此功能的主要使用者,但很可能將有更多的源生成器使用它。

#line hidden 指令不會影響錯誤報告中的檔名或行號。即,如果在隱藏塊中遇到錯誤,編譯器將報告當前檔名和錯誤的行號。

#line filename 指令指定您希望出現在編譯器輸出中的檔名。預設情況下,使用源**檔案的實際名稱。檔名必須括在雙引號 ("") 中。 源**檔案可以具有 #line 指令的任何編號。

示例

下面的示例說明偵錯程式如何忽略**中的隱藏行。執行此示例時,它將顯示三行文字。但是,當設定如示例所示的斷點並按 f10 鍵逐句通過**時,您將看到偵錯程式忽略了隱藏行。還請注意,即使在隱藏行上設定斷點,偵錯程式仍會忽略它。

// preprocessor_linehidden.cs

using system;

class mainclass

}九、#region

#region 使您可以在使用 visual studio **編輯器的大綱顯示功能時指定可展開或摺疊的**塊。例如:

#region myclass definition

public class myclass

}#endregion

備註:

#region 塊必須以 #endregion 指令終止。

#region 塊不能與 #if 塊重疊。但是,可以將 #region 塊巢狀在 #if 塊內,或將 #if 塊巢狀在 #region 塊內。

十、#endregion

#endregion 標記 #region 塊的結尾。

十一、#pragma

#pragma 用於給編輯器提供特殊的指令,說明如何編譯包含雜注的檔案。

#pragma pragma-name pragma-arguments

引數pragma-name

可識別雜注的名稱。

pragma-arguments

雜注特定的引數。

十二、#pragma warning

#pragma warning 可用於啟用或禁用某些警告。

#pragma warning disable warning-list

#pragma warning restore warning-list

引數warning-list

警告編號的逗號分隔列表。只輸入數字,不包括字首 "cs"。

當沒有指定警告編號時,disable 禁用所有警告,而 restore 啟用所有警告。

示例// pragma_warning.cs

using system;

#pragma warning disable 414, 3021

[clscompliant(false)]

public class c

}#pragma warning restore 3021

[clscompliant(false)] // cs3021

public class d

}十三、#pragma checksum

可用於生成原始檔的校驗和,以幫助除錯 asp.net 頁。

#pragma checksum "filename" "" "checksum bytes"

引數"filename"

要求監視更改或更新的檔案的名稱。

"" 檔案的全域性唯一識別符號 (guid)。

"checksum_bytes"

十六進製制數的字串,表示校驗和的位元組。必須是偶數字的十六進製制數。奇數字的數字會導致編譯時警告,從而使指令被忽略。

備註:visual studio 偵錯程式使用校驗和來確保找到的總是正確的源。編譯器計算原始檔的校驗和,然後將輸出發出到程式資料庫 (pdb) 檔案。最後,偵錯程式使用 pdb 來比較它為原始檔計算的校驗和。

此解決方案不適用於 asp.net 專案,因為算出的是生成的原始檔而不是 .aspx 檔案的校驗和。為解決此問題,#pragma checksum 為 asp.net 頁提供了校驗和支援。

在 visual c# 中建立 asp.net 專案時,生成的原始檔包含 .aspx 檔案(從該檔案生成原始檔)的校驗和。然後,編譯器將此資訊寫入 pdb 檔案。

如果編譯器在該檔案中沒有遇到 #pragma checksum 指令,它將計算校驗和,然後將算出的值寫入 pdb 檔案。

示例class testclass

" "" // new checksum}}

C語言 預處理器指令( define)

使用 define定義明示常量,例如 define two 2 可以使用注釋 define pi 3.1415923 定義pi define seconds per year 60 60 24 365 ul 定義一年有多少秒 不考慮閏年 上述巨集被稱為 類物件巨集 其定義的語法如下 define p...

C 預處理器指令

c 預處理器指令是在編譯時呼叫的。預處理器指令 preprocessor directive 告訴c 編譯器要編譯哪些 並指出如何處理特定的錯誤和警告。c 預處理器指令還可以告訴c 編輯器有關 組織的資訊。1.定義符號和取消符號定義的預處理指令 define 和 undef 預處理指令都以 號開頭並...

C 預處理器指令

預處理器指令從來不會轉化為可執行 中的命令,但會影響編譯過程中的各個方面。實際應用如 計畫發布二個版本的 即基本版本和擁有更多功能的企業版本,就可以使用這些預處理器指令 另外在編寫提供除錯資訊的 時,也可以使用預處理器指令。下面介紹幾個常用到的預處理器指令 define 和 undef 用法如 de...