gpt4 book ai didi

c++ - 可变参数宏中的参数计数无效

转载 作者:行者123 更新时间:2023-11-30 03:40:13 25 4
gpt4 key购买 nike

我正在尝试创建一个宏,该宏将迭代定义的术语列表,并为每个调用另一个宏,可能带有附加参数列表。这是我得到的:

#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__。这在过去也造成了问题,例如这里—— Why does this variadic argument count macro fail with 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__))

这会在 VS 和 gcc 中为您提供所需的结果。

关于c++ - 可变参数宏中的参数计数无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38209120/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com