Variadic マクロ拡張は、引き数を可変数個持つマクロに関連する C99 に対する 2 つの拡張のことです。 1 つ目の拡張は、可変引き数 ID を __VA_ARGS__ からユーザー定義の ID にリネームするためのメカニズムです。 この拡張は、C99 に対して直交です。もう 1 つの拡張は、変数引き数が指定されていない 場合に、variadic マクロ内のぶら下がりコンマを取り外す方法を提供します。 この拡張は非直交です。 どちらの拡張も、 GNU C および C++ で開発されたプログラムの移植を容易にするためにインプリメントされています。
この C++ のインプリメンテーションは、
C との互換性のために、variadic マクロ拡張をサポートするように Standard C++ および C++98 を拡張します。
__VA_ARGS__ の代わりの ID
以下の例は、__VA_ARGS__ の代わりの ID の使用法を示したものです。マクロ debug の最初の定義は、 __VA_ARGS__ の通常の使用の実例となります。2 番目の定義は、 __VA_ARGS__ の代わりの ID args の使用を示します。
#define debug1(format, ...) printf(format, __VA_ARGS__) #define debug2(format, args ...) printf(format, args)
呼び出し | マクロ展開の結果 |
---|---|
debug1("Hello %s¥n","World"); | printf("Hello %s¥n","World"); |
debug2("Hello %s¥n","World"); | printf("Hello %s¥n","World"); |
末尾のコンマの取り外し
プリプロセッサーは、関数マクロに対する可変引き数が省略されているか空であり
、## に先立つコンマが、関数マクロ定義の可変引き数 ID より前にある場
合、その末尾のコンマを取り外します。