目次

マクロの分類

 #defineによるマクロ定義はオブジェクト形式マクロ(object-like macro)関数形式マクロ(function-like macro)に大別できる。

オブジェクト形式マクロ

例:

#define TRUE 1
#define FALSE 0
  • コンパイル時に単純な置換が行われる。

関数形式マクロ

  • 通常の関数呼び出しと同じように呼び出すことができる。

例:

#define max(a,b) ((a) > (b) ? (a) : (b))
  • 引数も含めた展開が行われる。
  • 関数形式マクロの定義側では、マクロ名と「(」の間に空白を入れてはならない。
    • (×)#define max (a,b)
    • 関数形式マクロの呼び出し側では、マクロ名と「(」の間に空白を入れても問題ない。
  • 識別子の前後を括弧で囲むと、マクロの呼び出しが抑制されて、max関数が呼び出される。
    • 例:x = (max)(a,b);

マクロの使用における注意点

  • マクロ名と同じ名前を、他の用途(例えば、関数や関数プロトタイプ宣言の引数など)で使ってはならない。
    • 使うとコンパイルエラーになるはず。

参考文献

  • 『C言語プログラミングの落とし穴』