相关疑难解决方法(0)

使用VS 2008和GCC时对__VA_ARGS__的不同处理问题

我试图找出一个问题,因为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可变参数宏的正确解释?或者我的用法属于未定义的行为?

gcc visual-studio-2008

7
推荐指数
2
解决办法
1921
查看次数

标签 统计

gcc ×1

visual-studio-2008 ×1