在 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) 上?显然 this is a bug in VS2005 .
最佳答案
不幸的是,我不再使用 Visual C++(因此无法验证它是否有效),但是您可以尝试一下吗?
#define MY_CALL(FUN, ...) \
if(prepare(x, y)) { \
int fail[] = {0,} \
FUN(__VA_ARGS__); \
}
使用 gcc 4.2,两者
{0,}
和 {0}
在那种情况下是允许的,所以如果逗号被删除了也没关系。但是,我不确定这是否被规范、普遍实现的扩展或特定于 gcc 的东西普遍接受。如果
{0,}
Visual C++ 允许语法,那么这有望解决您的问题(假设我正确理解 __VA_ARGS__
之前的最新逗号是被错误删除的内容,无论它出现在语法中的什么位置)。
关于visual-c++ - 是否可以防止在 Visual C++ 中删除带有空 __VA_ARGS__ 的逗号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7103824/