可変個数の実引数の個数

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

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

#define foo(...)  (sizeof((int[]){__VA_ARGS__})/sizeof(int))

このマクロを使えば、foo に渡された整数値の個数を知ることができます。C99では、配列の初期化子であっても、自動記憶域期間を持つ場合には定数式である必要がないため、foo には、評価結果を int 型に暗黙的に変換可能であれば、任意の式を記述することができます。

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

この記事のトラックバックURL:

http://www.kijineko.co.jp/trackback/317

名前付きの実引数が実現できるかも...

かなり前に書いた「可変個数の実引数の個数」や、本日書いた「マクロの可変個実引数の型を強制する」では、複合リテラルを使って何ができるかを模索しているわけです。この手のネタは

このエントリーを含むはてなブックマーク