こんにちは、高木です。

今回は、以前のサイトで貧乏録として書き留めていた内容に、少し加筆、修正して再掲載する者です。もともと単なる思いつきですので、決して過信しないようにしてください。

上のような省略記号(…)を持つ可変個引数マクロは、もともとGCC拡張だった仕様をC99から標準規格が追認したものです。省略記号の部分に指定した実引数を扱うには、__VA_ARGS__を使う必要があります。それ以前にマクロですので、関数原型のように型を指定できるわけでもなく、実引数の型を強制する方法は原則としてありません。それがよいところでもあり、悪いところでもあるのがマクロです。

今回は、そうしたマクロの特徴にあえて歯向かい、実引数の型を(関数と同程度に)強制しようという試みです。関数と同程度ですので、完全に型が合致する引数しか受け付けないということではなく、暗黙的に型変換できる場合はOKです。

上記のようにすれば、第1引数はint型に暗黙的に変換できる型でなければならず、第2引数はdouble型に暗黙的に変換できる型でなければならず、第3引数はconst char*型に暗黙的に変換できる型でなければなりません。また、個数は1〜3個でなければなりません。

C++であれば、複合リテラルは使えませんので、代わりにtupleを使うといいでしょう。

C99以降、C言語にはC++には独自の仕様がいくつかあります。今回使った複合リテラルもそのひとつです。C++20になってもまだC++に導入されていない仕様も多々ありますので、いろいろ試してみると面白いことができそうです。今後も、C言語特有のネタを取り上げていけたらと考えています。

今回は簡単ですが、このあたりで