宏 (#define指示詞)
預處理器指示詞,可建立類似函式的宏。
#define 識別碼 ( argument0, ... , argumentN-1 ) token-string |
---|
參數
項目 | 描述 |
---|---|
識別碼 |
宏的識別碼。 具有目前內容中已存在識別碼的宏的第二個 #define 會產生錯誤,除非第二個權杖序列與第一個標記序列相同。 |
( argument0, ... , argumentN-1 ) |
宏的引數清單。 引數清單是以逗號分隔,可以是任何長度,而且必須以括弧括住。 清單中的每個引數名稱都必須是唯一的。 沒有空白字元可以分隔 識別碼 參數和左括弧。 使用行串連,將反斜線 (\) 緊接在分行符號之前,將長指示詞分割成多個來源行。 |
token-string [選擇性] |
宏的值。 此參數包含一系列標記,例如關鍵字、常數或完整語句。 一或多個空白字元必須分隔此參數與 識別碼 參數;這個空白字元不會被視為替代文字的一部分,也不會在文字的最後一個標記後面有任何空白字元。 使用括弧來確保正確解譯複雜的引數。 如果 識別碼 參數的值發生在 token-string 參數內,即使因為另一個宏展開) 而 (,它也不會展開。 如果您排除此參數,則會從原始程式檔中移除 識別碼 參數的所有實例。 識別碼會維持定義狀態,而且可以使用 定義的#if、#ifdef和#ifndef 指示詞進行測試。 |
備註
原始程式檔中#define指示詞之後發生的所有識別碼參數實例都會構成宏呼叫,而且識別碼會取代為具有實際引數的token-string參數版本,該版本會取代為正式參數。 呼叫中的參數數目必須符合巨集定義中的參數數目。 只有在識別碼形成權杖時,才會被取代;例如,如果識別碼出現在批註、字串內或做為較長識別碼的一部分,則不會取代識別碼。
#undef指示詞指示預處理器忘記識別碼的定義;如需詳細資訊,請參閱 #undef 指示詞 (DirectX HLSL) 。
使用 /D 編譯器選項定義常數的效果,與在檔案開頭使用 #define 指示詞的效果相同。 最多可以使用 /D 選項定義 30 個宏。
宏調用中的實際引數會與巨集定義中的對應型式引數相符。 除非引數前面加上字串化 (#) 、字元化 (#@) 或標記貼上 (##) 運算子,否則標記字串中的每個型式引數都會取代為對應的實際引數,或後面接著 ## 運算子。 實際引數中的所有巨集都會在指示詞取代型式參數之前展開。
貼在 HLSL 編譯器中的權杖與 C 編譯器中貼上的權杖稍有不同,也就是說,貼上的權杖本身必須是有效的權杖。 例如,請考慮下列巨集定義:
#define MERGE(a, b) a##b
MERGE(float, 4x4) test;
在 C 編譯器中,這會產生下列結果:
float4x4 test
不過,在 HLSL 編譯器中,這會產生下列結果:
float4 x4 test
您可以改用下列巨集定義來解決此行為。
MERGE(MERGE(float, 4), x4) test;
範例
下列範例會使用宏來定義資料指標行。
#define CURSOR(top, bottom) (((top) << 8) | (bottom))
下列範例會定義宏,以擷取指定範圍中的虛擬隨機整數。
#define getrandom(min, max) \
((rand()%(int)(((max) + 1)-(min)))+ (min))