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