可变宏中的无效参数计数
Invalid argument count in a variadic macro
我正在尝试创建一个宏,该宏将迭代定义的术语列表,并为每个调用另一个宏,可能有额外的参数列表。这是我得到的:
#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'
,其中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。我错过了什么?有什么方法可以让它工作吗?
问题是Visual Studio扩展__VA_ARGS__
后,他们被传递到后续的宏,而不是之前。这在过去也引起过问题,例如这里——为什么这个可变参数计数宏在vc++中失败?
#include <iostream>
#define ITERATE(MACRO, ...)
MACRO(1, __VA_ARGS__) MACRO(2, __VA_ARGS__)
#define BODY(IterationArg, Arg1, Arg2)
std::cout << #Arg1 << std::endl;
int main() {
ITERATE(BODY, 8, 9)
return 0;
}
对参数#Arg1
进行字符串化处理,在输出中显示其内容:
8, 9
8, 9
不是我们想要的,对吧?
解决方案与链接问题相同:通过虚拟EXPAND
宏强制扩展:
#define EXPAND(x) x
#define ITERATE(MACRO, ...)
EXPAND(MACRO(1, __VA_ARGS__)) EXPAND(MACRO(2, __VA_ARGS__))
相关文章:
- std::cin >>上的参数无效
- 结果失败或多个参数无效
- 错误:一元"*"的类型参数无效(具有"int"):使用 mergesort 计算
- 错误 带有模块的一元"*"(具有"int")的类型参数无效
- 由于调用 std::condition_variable 后参数无效而导致应用程序崩溃
- MPI_Iprobe:RMA 调用中的位移参数无效
- 推力::sort_by_key上的配置参数无效
- windres 致命错误:将输出写入时:参数无效
- 一元'*'的类型参数无效(有双精度)
- C++:传递给 C 运行时函数的参数无效
- 矢量模板参数无效
- 写入 -: 参数无效 } 时出错
- winsock2:recvfrom()函数以错误10022(参数无效)结束
- 模板参数的显式指定参数无效,该参数是 constexpr
- 模板参数无效
- 调用 getter 成员时的参数无效
- 模板模板参数中的参数无效
- 方法调用中的参数无效
- POSIX 计时器:参数无效
- C++类模板是一个模板:模板参数无效