C99で導入されたプリプロセッサマクロの可変長引数を使って、引数の個数によるオーバーロードっぽいことをするメモ。
参考:
- c – Overloading Macro on Number of Arguments – Stack Overflow
- [C言語] 可変引数マクロの作り方 – Qiita
- 余談 C++ Design: g++とvc++の可変引数マクロの挙動の違い
可変長引数の部分への実引数が0個というのはC言語の規格的にはナシなので、引数が0個の場合には対応しない。(幾つかのコンパイラでは引数が0個でも通るが…)
GCCの場合に0個の引数を処理したい場合、GCC拡張の , ## __VA_ARGS__
みたいなやつを使うといい感じになる。
VC++で
#define CHOOSE(a0,a1,...)
#define hoge(...) CHOOSE(__VA_ARGS__)
という風に書くと、 __VA_ARGS__
の部分が一つの引数(a0
)として関数型マクロに渡ってしまうので、ここに書いたコードでは CHOOSE
→ CHOOSE2
という風にもう一段階噛ませている。
C11の _Generic
とかを使えば引数の型によるオーバーロードもできそうだ。先例: