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

标签 visual-studio-2008 gcc

由于可变参数宏的不寻常使用,我试图找出一个问题。这是假设的宏:

#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/

相关文章:

c++ - 通过复制传递 std::string 会被优化吗?

c++ - 为什么我在这里需要复制构造函数

c# - 在 VS2008 中的 Windows x64 上调试 x86 .NET 应用程序

mysql - 如何将日期值放入变量中?

c++ - CWinApp::OpenDocumentFile 创建一个新窗口

用GCC编译一个C程序,使其可以在linux中使用所有cpu核

c - 查找头文件包含路径

visual-studio-2008 - Visual Studio 2008 中的 "Undo"功能停止工作

gcc - 使用 gcc 链接到随 Homebrew 安装的动态库?

c - 为什么 gcc 将错误消息分成几行?