C言語のマクロはどう処理されるか
C言語におけるマクロとは、コンパイル前にソースコードに対してテキスト置換を行うプリプロセッサの一種であり、#defineキーワードで定義され、引数を受け取ることが可能です。
マクロの処理は、マクロ定義段階とマクロ展開段階の2つの段階に分かれます。
- マクロ定義段階: この段階では、プリプロセッサはコード内のマクロ定義をスキャンし、それらを保存します。マクロ定義の構文は #define マクロ名 置換テキストで、マクロ名はマクロの名前を表し、置換テキストはマクロ展開時に置き換えるコードを表します。マクロ定義のスコープは、定義後からファイルの末尾まで、または #undef ディレクティブに出会うまでです。
- マクロ展開段階: この段階では、プリプロセッサはコード内のマクロ呼び出しに基づいて、マクロを対応するコードに展開します。マクロ呼び出しの構文は マクロ名(引数) で、ここで引数は有効な C 式です。展開プロセスでは、プリプロセッサはマクロ呼び出しをマクロ定義の置換テキストに置き換え、引数の置換を行います。マクロ呼び出しの引数がマクロ定義内で複数回使用されている場合、展開のたびに置換が行われます。展開が完了したら、展開後のコードに対して引き続き後処理を行います。
ただし、マクロの展開が単純な文字置換であり、構文チェックが行われない点に注意が必要。そのため、マクロを使用する際は、予期せぬエラーにならないよう注意深く行う必要がある。また、マクロの展開はコンパイル前に行われるため、実行時にマクロの定義を動的に変更することはできない。