#define ディレクティブ (マクロ)
関数のようなマクロを作成するプリプロセッサ ディレクティブ。
#define identifier( argument0, ... , argumentN-1 ) token-string |
---|
パラメーター
Item | 説明 |
---|---|
識別子 |
マクロの識別子。 現在のコンテキストに既に存在する識別子を持つマクロの 2 番目の #define は、2 番目のトークン シーケンスが最初のトークン シーケンスと同じでない限り、エラーを生成します。 |
( argument0, ... , argumentN-1 ) |
マクロの引数の一覧。 引数リストはコンマ区切りであり、任意の長さにすることができ、かっこで囲む必要があります。 リスト内の各引数名は一意である必要があります。
識別子パラメーターと始めかっこを空白で区切る必要はありません。 行連結を使用すると、改行文字の直前に円記号 (\) が配置され、長いディレクティブが複数のソース行に分割されます。 |
token-string [省略可能] |
マクロの値。 このパラメーターは、キーワード、定数、完全なステートメントなどの一連のトークンで構成されます。 1 つ以上の空白文字は、このパラメーターを identifier パラメーターから分離する必要があります。この空白は、置換されたテキストの一部とは見なされず、テキストの最後のトークンの後の空白も含まれません。 かっこを自由に使用して、複雑な引数が正しく解釈されるようにします。 identifier パラメーターの値が token-string パラメーター内で発生した場合 (別のマクロ拡張の結果であっても)、展開されません。 このパラメーターを除外すると、 identifier パラメーターのすべてのインスタンスがソース ファイルから削除されます。 識別子は定義されたままであり、定義された #if、#ifdef、および #ifndef ディレクティブを使用してテストできます。 |
注釈
ソース ファイルの #define ディレクティブの後に発生するすべての identifier パラメーターのインスタンスがマクロ呼び出しを構成し、識別子は、正式なパラメーターに置き換えられた実際の引数を持つトークン文字列パラメーターのバージョンに置き換えられます。 呼び出しのパラメーターの数は、マクロ定義内のパラメーターの数と一致している必要があります。 識別子は、トークンを形成する場合にのみ置き換えられます。たとえば、コメント内、文字列内、またはより長い識別子の一部として表示される場合、識別子は置き換えられません。
#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))