聲明指令用於定義或取消定義條件編譯符號。
對 #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