2.7 プリプロセッサ

  2.マクロ置換
 次の定義
#define TRUE 1
などは、最も単純なマクロ置換です。これは、その名前を文字列で置き換えよ、ということです。置き換えられるべき文字列は任意に設定でき、定義できるものには殆ど文法的な制限はありません。なお、#defineで定義したマクロのスコープは、定義した時点から、そのファイルの最後までです。

 注意点としては、引用符で囲まれた文字列には置換が適用されない、ということです。
例えば、
printf("TRUE");
などという行があったとしても、このTRUEは1には置換されないということです。

 一方、引数つきのマクロ定義も可能です。これを用いることで、テキストの置換はマクロの呼び方に依存することになります。例えば、A,Bという2つの引数を比較して大きい方を返すようなマクロ max として、
#define max(A,B)  ((A) > (B) ? (A):(B))
と定義すると、行
x = max(p+q, r+s);
は、次の行に置換されます。(引数の括弧の用い方に注意しなさい)
x = ((p+q) > (r+s) ? (p+q):(r+s));
 これは大変有用な技術であり、関数呼び出しを使わずに、in-lineコードに展開される「最大値関数」を使っていることになります。関数の場合と違って、データ型が違っても、別のマクロ定義 max を持ってくることなく、最大値計算部分のマクロを利用することができます。