分类: C/C++
2013-06-03 16:56:03
#define eprintf(...) fprintf (stderr, __VA_ARGS__) 当可变参数宏被调用后,参数列表中的所有符号(包括逗号)都成为变量参数并替换__VA_ARGS__在宏中出现的位置。例如:
eprintf ("%s:%d: ", input_file, lineno) ==> fprintf (stderr, "%s:%d: ", input_file, lineno)
#define eprintf(SEX_VA...) fprintf (stderr, SEX_VA)
注意:不能用让这一扩展和__VA_ARGS__出现在同一个宏中。例如:
#define eprintf(SEX_VA...) fprintf (stderr, __VA_ARGS__)
我们也可以在可变参数宏中定义命名参数,例如
#define eprintf(format, ...) fprintf (stderr, format, __VA_ARGS__)
上面宏看起来很不错,但是有一个不完美的地方。例如:
eprintf("success!\n", ); ==> fprintf(stderr, "success!\n", );上面的写法会报错。因为标准C中不能忽略用来隔离命名参数和可变参数的逗号。
eprintf ("success!\n") ==> fprintf(stderr, "success!\n", );再次,使用有特殊意思的符号'##'放置在逗号与可变参数(__VA_ARGS__)之间。例如:
#define eprintf(format, ...) fprintf (stderr, format, ##__VA_ARGS__)当你eprintf宏被使用时,可变参数会被忽略,然后在'##'前的逗号会被删除掉。
测试代码: #include#define eprintf_1(SEX_VA...) fprintf (stderr, SEX_VA) #define eprintf_2(...) fprintf (stderr, __VA_ARGS__) #define eprintf_4(format, ...) fprintf (stderr, format, ##__VA_ARGS__) #define eprintf_5(format, ...) fprintf (stderr, format, __VA_ARGS__) int main(void) { eprintf_1("1, ok : %d\n", 111); eprintf_2("2, ok : %d\n", 222); eprintf_4("4, ok : 444\n"); eprintf_5("5, ok : %d\n", 555); return 0; }