Share via


#define のディレクティブ (C/C++)

#define はトークン文字列を使用して識別子またはパラメーター識別子の関連付けである マクロを 作成します。マクロを定義するとコンパイラはソース ファイル内の識別子が繰り返されてトークン文字列に置き換えることができます。

構文

#define 識別子 トークン文字列 opt

#define 識別子 ( 識別子 opt, … , 識別子 opt) トークン文字列 opt

解説

#define のディレクティブはコンパイラはソース ファイルの 識別子 が繰り返されての トークン文字列 を使用します。 識別子 はトークンを作成した場合のみ置換されます。つまり 識別子 は注釈で文字列または長い識別子の一部としては置き換えられません。詳細については、「C++ トークン」を参照してください。

トークン文字列 の引数にはキーワード定数または完全なステートメントなどの一連のトークンで構成されます。一つ以上の空白文字が 識別子 から トークン文字列 を区切る必要があります。この余白は代わりにされるテキストの一部とは見なされませんテキストの最後のトークンの後に含まれる空白です。

トークン文字列 のない #define はソース ファイルから 識別子 に出現したものを削除します。 識別子 が定義したままになり#if defined と #ifdef のディレクティブを使用してテストできます。

2 番目の構文形式ではパラメーターの関数とマクロを定義します。このフォームはかっこ内に記述する省略可能なパラメーターのリストを指定します。マクロを定義すると 識別子 ( 識別子 opt… 識別子 opt) の後続の各繰り返しは仮パラメーターと置き換える実際の引数を持つ トークン文字列 の引数のバージョンに置き換えられます。

仮パラメーター名では トークン文字列 実際の値が代入される場所を示します。各パラメーターは トークン文字列 を複数回表示され名前は任意の順序でも指定できます。呼び出しの引数の数はマクロ定義のパラメーターに一致する必要があります。複雑な実引数が正しく解釈されることによりかっこで自由に使用します。

リストの仮パラメーターはコンマで区切ります。リストの各名前は一意であるリストをかっこで囲む必要があります。空間は 識別子 と左かっこを分離することはできません。は複数のソース行の長いディレクティブに対し行連結 (改行文字の直前のバックス ラッシュ () を配置します \ 使用します。仮パラメーター名のスコープは トークン文字列 を終了新しい行にを拡張します。

マクロが 2 番目の構文形式で定義されている場合は引数リストに続く後続のテキストのインスタンスはマクロはを示します。実引数がマクロ定義の仮パラメーターに対応するソース ファイルの 識別子 のインスタンスに従って一致します。()#stringizing#@charizing () または () 演算子 ## トークンを貼り付けることに指定されていない場合に## の演算子を指定していない トークン文字列 の各対応する仮パラメーターと実引数に置き換えられます。実引数のマクロはディレクティブに置き換えます仮パラメーターの前に配置されます。(演算子は プリプロセッサ演算子 で説明します)。

引数を持つマクロの例は #define の構文の 2 番目のフォームを示しています :

// Macro to define cursor lines 
#define CURSOR(top, bottom) (((top) << 8) | (bottom))

// Macro to get a random integer with a specified range 
#define getrandom(min, max) \
    ((rand()%(int)(((max) + 1)-(min)))+ (min))

副作用の引数によりマクロ予期しない結果を生成します。特定の仮パラメーターは トークン文字列 の 1 回以上表示されることがあります。その仮パラメーターが副作用と置き換えられる式と式は副作用とが 1 回だけ評価されることがあります。(トークン演算子 (##) を貼り付けます の下の例を参照してください。

#undef のプリプロセッサ ディレクティブは識別子の定義を忘れた。詳細については#undef のディレクティブ を参照してください。

トークン文字列 に定義されているマクロの名前 (一方別のマクロの展開の場合) 発生した場合配置されません。

2 番目のシーケンスが 1 番目のトークンと同じでなければ同じ名前を持つマクロの秒 #define は警告を生成します。

Microsoft 固有の仕様 →

新しい定義が元の定義と構文的に同一の場合はMicrosoft C/C++ マクロを定義し直すことができます。つまり2 種類の定義はパラメーターの名前を付けることができます。必要な 2 種類の定義は構文で同じであることをこの動作は ANSI の C とは異なります。

たとえば次の 2 種類のマクロはパラメーター名を除いて同一です。ANSI の  15 ではこのような再定義Microsoft C/C++ のコンパイルがエラーなしで使用できません。

#define multiply( f1, f2 ) ( f1 * f2 )
#define multiply( a1, a2 ) ( a1 * a2 )

一方次に示す 2 種類のマクロは同じでありMicrosoft C/C++ の警告が生成されます。

#define multiply( f1, f2 ) ( f1 * f2 )
#define multiply( a1, a2 ) ( b1 * b2 )

終了 Microsoft 固有の仕様→

この例では #define のディレクティブを示します :

#define WIDTH       80
#define LENGTH      ( WIDTH + 10 )

最初のステートメントは整数定数に 80 WIDTH 識別子を定義しWIDTH と整数定数 10. の点で LENGTH を定義します。LENGTH が繰り返されては置き換えられます (WIDTH + 10)。次にWIDTH + 10 が繰り返されては式 80 + 10() に置き換えられます。WIDTH + 10 を囲むかっこは次のようなステートメントの解釈を制御するため重要です :

var = LENGTH * 20;

事前処理段階でステートメントの後 :

var = ( 80 + 10 ) * 20;

評価するかが 1800 になります。かっこを付けずに結果は次のとおりです :

var = 80 + 10 * 20;

評価するかが 280 になります。

Microsoft 固有の仕様 →

/D コンパイラ オプション マクロおよびグローバル定数を定義するとファイルの先頭にディレクティブをプリプロセスします #define を使用する場合と同じ効果があります。30 個のマクロは /D オプションを使用して定義できます。

終了 Microsoft 固有の仕様→

参照

関連項目

プリプロセッサ ディレクティブ