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

Mar*_* Ba 7 macros preprocessor visual-c++ variadic-macros

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

#define MY_CALL(FUN, ...) \
  if(prepare(x, y)) {     \
    FUN(__VA_ARGS__);     \
  }
/**/
Run Code Online (Sandbox Code Playgroud)

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

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

if(prepare(x y)) { funct(); }
Run Code Online (Sandbox Code Playgroud)

太棒了,不是吗?

我该如何修复这个宏,以便__VA_ARGS__在Visual C++(VS 2005)上使用零?


显然这是VS2005中的一个错误.

Jay*_*ik- 6

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

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

使用GCC 4.2,两者{0,}{0}允许在这方面,所以如果逗号被删除或者不是也没有什么关系.但是,我不确定这是否在规范,通常实现的扩展或gcc特定的内容中被普遍接受.

如果{0,}语法由Visual C++允许,那么这将有望解决您的问题(假设我理解正确的话,最近一段时间逗号前__VA_ARGS__是什么是被错误删除,不论它在语法出现的地方).

  • 谢谢!我插入了"line"`"dum","my";`相反,这就行了. (2认同)