我正在尝试创建一个宏,它将迭代定义的术语列表,并为每个术语调用另一个宏,可能还带有附加参数列表。这是我得到的:
#define ITERATE_OVER_TERMS(MACRO, ...) \
MACRO(Term1, __VA_ARGS__) \
MACRO(Term2, __VA_ARGS__) \
MACRO(Term3, __VA_ARGS__) \
... and so on
但是,当我尝试将它与 Visual Studio 2015 一起使用时,出现错误
warning C4003: not enough actual parameters for macro 'BODY'
where BODY
是作为传递的宏的名称MACRO
争论。虽然从技术上来说是一个警告,但它表明扩展中出现了问题。
为了缩小错误范围,我将示例简化为以下内容:
#include <iostream>
#define ITERATE(MACRO, ...) \
MACRO(1, __VA_ARGS__) MACRO(2, __VA_ARGS__)
#define BODY(IterationArg, Arg1, Arg2) \
std::cout << IterationArg << Arg1 << Arg2 << std::endl;
int main() {
ITERATE(BODY, 8, 9)
return 0;
}
它给了我如上所示的错误,而我期望它能够成功编译并产生输出
189
289
它似乎可以用 g++ 编译,但不能用 Visual Studio 编译。
我缺少什么?有一些解决办法可以让它发挥作用吗?