是否可以防止在Visual C ++中删除空__VA_ARGS__的逗号?

时间:2011-08-18 07:27:58

标签: visual-c++ macros preprocessor variadic-macros

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

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

只要函数至少有一个参数,我就没事了。

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

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

很好,不是吗?

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


显然是this is a bug in VS2005

1 个答案:

答案 0 :(得分: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__之前的最新逗号是什么被错误删除,无论它出现在语法中的哪个位置。)