由于可变参数宏的不寻常使用,我试图找出一个问题。这是假设的宏:
#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);
对于 gcc,预处理器将输出
printf("%d %d %d\n", 1, 2, 3)
但是对于 VS 2008,输出是
printf, “%d %d %d\n”, 1(2, 3);
我怀疑差异是由对的不同处理造成的。 VA_ARGS ,对于gcc,它会首先将表达式展开为va(printf, "%d %d %d\n", 1, 2, 3),并将1, 2, 3视为 VA_ARGS 用于宏弗吉尼亚州但是对于 VS 2008,它会首先将 b 视为 VA_ARGS 对于宏va,然后进行扩展。
哪一个是 C99 可变参数宏的正确解释?或者我的用法属于未定义的行为?
最佳答案
有一个简单的方法来处理这个问题:
#define exp(...) __VA_ARGS__
#define va(c, d, ...) c(d, __VA_ARGS__)
#define var(a, b, ...) exp(va(__VA_ARGS__, a, b))
var(2, 3, printf, “%d %d %d\n”, 1);
这将在 VS 2008 上起作用,并且不会影响 gcc
关于visual-studio-2008 - 使用 VS 2008 和 GCC 时对 __VA_ARGS__ 不同处理的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2575864/