语法
GCC named variable argument
#define eprintf(format, args...) fprintf (stderr, format, args)
或者
#define eprintf(format, args...) fprintf (stderr, format, ##args)
C99 standard variadic macro
#define eprintf(format, ...) fprintf (stderr, format, __VA_ARGS__)
GCC variadic macro
#define eprintf(format, ...) fprintf (stderr, format, ##__VA_ARGS__)
C++2a standard variadic macro
警告:这是未来标准的语法,现在不支持。预计要2020年之后发布的编译器才支持。
#define eprintf(format, ...) fprintf (stderr, format __VA_OPT__(,) __VA_ARGS__)
解释
gcc特色的“双井号”(##),是用于解决尾随逗号问题的,例如:
如果#define eprintf(format, args...) fprintf (stderr, format, args)
或#define eprintf(format, ...) fprintf (stderr, format, __VA_ARGS__)
那么
eprintf("%d %d\n", 10, 14);
扩展成 fprintf (stderr, "%d %d\n", 10, 14);
编译通过。
但是,
eprintf("Hello World\n");
扩展成 fprintf (stderr, "Hello World\n", );
此代码存在尾随逗号,于是编译错误。
如果#define eprintf(format, args...) fprintf (stderr, format, ##args)
或#define eprintf(format, ...) fprintf (stderr, format, ##__VA_ARGS__)
或#define eprintf(format, ...) fprintf (stderr, format __VA_OPT__(,) __VA_ARGS__)
那么
eprintf("%d %d\n", 10, 14);
扩展成 fprintf (stderr, "%d %d\n", 10, 14);
编译通过。
并且
eprintf("Hello World\n");
扩展成 fprintf (stderr, "Hello World\n");
编译通过。