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...