write ahead log

ロールフォワード用

Cで可変長引数のマクロを作る

Cで可変長引数のマクロを作れるらしい.(但し, C99以降)
知らなかったのでメモっとく.

要点

...はVA_ARGSで置き換えられる.

ちょっとした例

よくあるマクロ
(組み込みとかでありがち.ふつうは#ifdefとかで囲む)

char buf[1024]; //適当なサイズ,名前のバッファ.

#define DEBUG_PRINTLN(format_str) do { \
  sprintf(buf, "[ debug ]" format_str "\n"); \
  serial_write(buf, strlen(buf); // 組み込み環境で出力できる関数としよう
} while(0)

ふつうのマクロでやると引数の数を増やすとそれに対応したマクロが必要.

#define DEBUG_PRINTLN1(format_str, arg1) do { \
  sprintf(buf, "[ debug ]" format_str "\n", arg1); \
  serial_write(buf, strlen(buf); // 組み込み環境で出力できる関数としよう
} while(0)

#define DEBUG_PRINTLN2(format_str, arg1, arg2) do { \ ....(以下略)

#define DEBUG_PRINTLN3(format_str, arg1, arg2, arg3) do { \ ....(以下略)

可変長マクロを使うと以下の様にできる

char buf[1024]; //適当なサイズ,名前のバッファ.

#define DEBUG_PRINTLN(format_str, ...) do { \ <- ここポイント
  sprintf(buf, "[ debug ]" format_str "\n", __VA_ARGS__); \ <- ここポイント
  serial_write(buf, strlen(buf); 
} while(0)

...(可変長引数の指定子)の部分はVA_ARGSで利用されるらしい.

ただ、残念ながら今回の仕事の環境では使えなかったけど(C89までしか対応してないコンパイラだった)

ちなみにfuncとかもC99っぽいので使えなくて地味に不便.