共用方式為


宏 (#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))

DirectX HLSL (預處理器指示詞)

#define多載

#undef 指示詞 (DirectX HLSL)