こんにちは、高木です。

以前、とある切っ掛けから、可変個数の実引数の個数を自動的に知る方法を思いついたので、備忘録として書き留めておくことにします。対象はC99以降のC言語で、仮引数に省略記号を用いる関数形式マクロを利用します。

可変個数の実引数の個数を自動的に知るといっても、いろいろな型の実引数を混在して渡すような場合には対応できません。すべて算術型であることが必須条件です。では、さっそくコードを紹介しましょう。

このマクロを使えば、foo に渡された整数値の個数を知ることができます。C99以降では、配列の初期化子であっても、自動記憶域期間を持つ場合には定数式である必要がないため、foo には、評価結果をuintmax_t型に暗黙的に変換可能であれば任意の式を記述することができます。警告は出るかもしれませんが、ポインタを渡してもほとんどの場合は期待通りに動作すると思います。

もしかすると大きな穴があるかもしれませんが、これが使えると結構便利です。今後も継続して考察を続けることにします。