めのん@ひとりプログラミング同好会

このブログはすべてフィクションであり、実在の人物、団体とは一切関係ありません

可変個引数マクロを究める!(その3)

こんばんは、めのんです!

この根話ももう3回目になりました。 どこまで引っ張るんでしょうねえ?

前々回は、Cの可変個引数マクロがどんなものか、ざっとお話ししました。 そして、可変個引数がひとつもない場合の扱いが難しいことに触れました。

前回は、可変個引数がひとつもない場合に対応するために、Cコンパイラが提供している機能についてお話ししました。 現行規格ではうまくいかないんですよねー。

で、今回は現行規格でもどうにかなる方法についてお話していきたいと思います。

すべての引数を可変個引数にする

これは私が一番よく使う方法になります。

前回取り上げた標準エラーに書式付きで出力するeprintfマクロについて考えてみることにしましょう。

#define eprintf(...) fprintf(stderr, __VA_ARGS__)

前回は書式化文字列「format」が固定のマクロ引数になっていました。 ところが今回は、「format」がなくなってしまっています。 「format」はいらなくなったのでしょうか?

マクロの定義から「format」は消えましたが、実際に呼び出す際にはちゃんと「format」に相当する実引数を渡さなければなりません。 そう、可変個引数のひとつとして。

もし、「format」相当の実引数を渡さなければ、マクロとしてはOKでも、その先のfprintfで引数が適合しないことになりますから、コンパイルエラーになってしまいます。 エラーメッセージはちょっとわかりにくくなったかもしれませんが、間違ってコンパイルが通ってしまうよりずっといいでしょう。

ほとんどのケースで使える方法だと思いますのでお勧めです。

次回はちょっとトリッキーな手法について紹介したいと思います。

それでは!!!