マクロ (C/C++)
プリプロセッサでは、"プリプロセッサ ディレクティブ" (空白以外の最初の文字として # が含まれている行) を除くすべての行でマクロが展開されます。 これはマクロを、条件付きコンパイルの一部としてスキップされないいくつかのディレクティブの部分に展開します。 "条件付きコンパイル ディレクティブ" では、ソース ファイルの一部のコンパイルを抑制できます。 これらは定数式または識別子をテストして、コンパイラに渡すテキスト ブロックと、プリプロセス中にソース ファイルから削除するテキストブロックを決定します。
#define
ディレクティブは、通常、有意な識別子を定数、キーワード、および一般的に使用されるステートメントや式に関連付けるために使用されます。 定数を表す識別子は、"記号定数" または "マニフェスト定数" と呼ばれることがあります。 ステートメントまたは式を表す識別子は "マクロ" と呼ばれます。 このプリプロセッサのドキュメントでは、"マクロ" という用語のみ使用されます。
マクロの名前が、プログラムのソース テキストまたはその他のプリプロセッサ コマンドの引数で認識されると、そのマクロの呼び出しとして扱われます。 マクロ名はマクロ本体のコピーに置き換えられます。 マクロが引数を受け入れる場合、マクロの本体の仮パラメーターが、マクロ名とその後に続く実際の引数名に置き換えられます。 本体の処理済みのコピーでマクロ呼び出しを置き換えるプロセスは、マクロ呼び出しの "拡張" と呼ばれます。
実際には、2 種類のマクロがあります。 "オブジェクトのような" マクロでは引数を受け取りませんが、 "関数のような" マクロは、関数呼び出しと同じように引数を受け取るように定義できます。 マクロは実際の関数呼び出しを生成しないため、関数呼び出しをマクロと置き換えることで、プログラムをより高速で実行できることがあります (C++ では、多くの場合、インライン関数が推奨されるメソッドです)。ただし、マクロを定義して慎重に使用しないと、問題が発生する可能性があります。 引数のあるマクロ定義でかっこを使用して、式での適切な優先順位を維持することが必要な場合があります。 また、マクロが正しく副作用のある式を処理しない場合があります。 詳細については、「#define ディレクティブ」で紹介されている getrandom
の例を参照してください。
マクロを定義すると、元の定義を最初に削除しない限り、異なる値に再定義できません。 ただし、まったく同じ定義のマクロを再定義することができます。 したがって、同じ定義をプログラムで複数回使用できます。
#undef
ディレクティブは、マクロの定義を削除します。 定義を削除すると、そのマクロを異なる値に再定義できます。 「#define ディレクティブ」および「#undef ディレクティブ」では、#define
ディレクティブおよび #undef
ディレクティブについてそれぞれ説明します。
詳細については、次のトピックを参照してください。