7

在 Visual Studio 2005 上,我有一个看起来像这样的宏(示例!!):

#define MY_CALL(FUN, ...) \
  if(prepare(x, y)) {     \
    FUN(__VA_ARGS__);     \
  }
/**/

只要该函数至少接受一个参数,我就可以了。

当函数接受零参数时,预处理器“有用地”删除“尾随逗号”,扩展如下:

if(prepare(x y)) { funct(); }

太好了,不是吗?

如何修复此宏,使其__VA_ARGS__在 Visual C++ (VS 2005) 上使用零?


显然这是 VS2005 中的一个错误

4

1 回答 1

6

不幸的是,我不再使用 Visual C++(因此无法验证它是否有效),但你可以试试这个吗?

#define MY_CALL(FUN, ...) \
  if(prepare(x, y)) {     \
    int fail[] = {0,}     \
    FUN(__VA_ARGS__);     \
  }

使用 gcc 4.2,在该上下文中都允许使用{0,}{0},因此如果逗号被删除,则无关紧要。但是,我不确定这是否在规范中被普遍接受,通常实现的扩展,或者特定于 gcc 的东西。

如果 Visual C++ 允许该{0,}语法,那么这有望解决您的问题(假设我正确理解之前的最新逗号__VA_ARGS__是被错误删除的内容,无论它出现在语法中的什么位置)。

于 2011-08-18T07:44:27.257 回答