聲明指令用於定義或取消定義條件編譯符號。
對 #define
指令的處理使給定的條件編譯符號成為已定義的(從跟在指令後面的源代碼行開始)。類似地,對 #undef
指令的處理使給定的條件編譯符號成為未定義的(從跟在指令後面的源代碼行開始)。
源文件中的任何 #define
和 #undef
指令都必須出現在源文件中第一個“標記”(第 2.4 節)的前面,否則將發生編譯時錯誤。直觀地講,#define
和 #undef
指令必須位於源文件中所有“實代碼”的前面。
示例:
#define Enterprise #if Professional || Enterprise #define Advanced #endif namespace Megacorp.Data { #if Advanced class PivotTable {...} #endif }
是有效的,這是因為 #define
指令位於源文件中第一個標記(namespace
關鍵字)的前面。
下面的示例產生編譯時錯誤,因為 #define
指令在實代碼後面出現:
#define A namespace N { #define B #if B class Class1 {} #endif }
#define
指令可用於重復地定義一個已定義的條件編譯符號,而不必對該符號插入任何 #undef
。下面的示例定義一個條件編譯符號 A
,然後再次定義它。
#define A #define A
#undef
指令可用於取消定義一個本來已經是未定義的條件編譯符號。下面的示例定義一個條件編譯符號 A
,然後兩次取消定義該符號;第二個 #undef
沒有作用但仍是有效的。
#define A #undef A #undef A