関数マクロ

関数マクロについて解説します。関数マクロは、プリプロセッサによってコンパイル前に展開される疑似的な関数です。

#define マクロ関数名(引数1, 引数2, ...) 処理の内容

関数マクロは副作用をもたらす危険性がとても大きいので、まず使わないことを推奨します。

ただし、最速にチューニングしたい場合に、コンパイラのインライン展開に依存するのが、どうしても嫌だという場合もあるでしょうし、また、どうしても関数マクロを使いたいエッジなケースもあるでしょう。

そのような場合は「do { } while (0)」で処理を囲むと副作用を減らすことができます。この場合は、戻り値を戻せません。マクロ関数では、直接値を書き換えることもできますが、変更したい値がある場合は、C言語の関数の仕様に合わせるために、ポインタで渡すのをお勧めします。

関数マクロのサンプルプログラム

関数マクロを使った、二つの数を足し算するサンプルです。処理が複数行にわたるときは改行を「\」でエスケープしましょう。

#include <stdio.h>
#include <stdint.h>

// 関数マクロの定義
#define MYAPP_ADD(in1, in2, out_ptr) \
do {\
  *out_ptr = in1 + in2;\
} while (0)\

int main(void) {
  int32_t num1 = 3;
  int32_t num2 = 2;
  int32_t total = 0;
  
  // 関数マクロの使用
  MYAPP_ADD(num1, num2, &total);
  
  printf("%d\n", total);
}

関連情報