我试图找出一个问题,因为variadic宏的使用不正常.这是假设宏:
#define va(c, d, ...) c(d, __VA_ARGS__)
#define var(a, b, ...) va(__VA_ARGS__, a, b)
var(2, 3, printf, “%d %d %d\n”, 1);Run Code Online (Sandbox Code Playgroud)
对于gcc,预处理器将输出
printf("%d %d %d\n", 1, 2, 3)Run Code Online (Sandbox Code Playgroud)
但对于VS 2008,输出是
printf, “%d %d %d\n”, 1(2, 3);Run Code Online (Sandbox Code Playgroud)
我怀疑差异是由于对VA_ARGS的不同处理造成的,对于gcc,它首先将表达式扩展为va(printf,"%d%d%d \n",1,2,3),并处理1,2 ,3作为宏va 的VA_ARGS.但对于VS 2008,它将首先将b视为VA_ARGS用于宏va,然后进行扩展.
哪一个是C99可变参数宏的正确解释?或者我的用法属于未定义的行为?