Variadic のマクロ
Variadic マクロは可変個の引数を含む関数に似たマクロです。
解説
variadic マクロを使用するには省略記号が最終的なマクロ定義の仮引数として指定され余分な引数を挿入するために定義に置換の識別子 __VA_ARGS__ に使用することがあります。__VA_ARGS__省略記号に一致する間にコンマを含むすべての引数に置き換えられます。
C 規格では1 文字以上の引数が省略記号を渡す必要があるマクロの末尾にコンマを含む式に解決しないようにすることを指定します。Visual C++ の実装は引数が省略記号を渡すにはコンマを抑制します。
使用例
// variadic_macros.cpp
#include <stdio.h>
#define EMPTY
#define CHECK1(x, ...) if (!(x)) { printf(__VA_ARGS__); }
#define CHECK2(x, ...) if ((x)) { printf(__VA_ARGS__); }
#define CHECK3(...) { printf(__VA_ARGS__); }
#define MACRO(s, ...) printf(s, __VA_ARGS__)
int main() {
CHECK1(0, "here %s %s %s", "are", "some", "varargs1(1)\n");
CHECK1(1, "here %s %s %s", "are", "some", "varargs1(2)\n"); // won't print
CHECK2(0, "here %s %s %s", "are", "some", "varargs2(3)\n"); // won't print
CHECK2(1, "here %s %s %s", "are", "some", "varargs2(4)\n");
// always invokes printf in the macro
CHECK3("here %s %s %s", "are", "some", "varargs3(5)\n");
MACRO("hello, world\n");
// MACRO("error\n", EMPTY); would cause C2059
}