可变参数宏 - 可选初始值设定项表达式

variadic macro - optional initializer expression

本文关键字:表达式 变参 参数      更新时间:2023-10-16

我想要一个macro,它声明一个具有给定名称和可选初始值设定项表达式的int

我尝试在堆栈溢出上使用此答案,但没有成功。

这是我尝试过的:

#define macro(...) int FIRST(__VA_ARGS__)(REST(__VA_ARGS__))

像这样使用时没有问题:

macro(foo);

但是当给定初始值设定项时会出现错误:

macro(foo, 42);

另一种选择 - 在没有参数时,仅使用 __VA_ARGS__ 会发出来自 GCC 中-pedantic的警告。

我该如何解决这个问题?

当没有初始值设定项表达式时,是否也可以避免()大括号 - 这意味着没有零初始化而是默认值?

请注意,我的真实用例不仅适用于int,也适用于任何类型的用例,并且使用像 boost 这样的第三方不是一种选择。

#define macro(...) int FIRST(__VA_ARGS__){REST(__VA_ARGS__)}

你的主要问题是int foo();是一个函数声明。 int foo{};不是。

最后我得到了以下内容: 链接

我将__VA_ARGS__转发到可变参数模板,因为我的问题并不完全是我在这里描述的(如评论中所建议的( - 但是不提供初始值设定项时的问题仍然存在 - 所以我用 #pragma GCC system_header 和 Clang 的标头中静音了警告,对于 Clang,我使用 _Pragma() 进行-Wgnu-zero-variadic-macro-arguments。MSVC不是问题。

我也成为最令人烦恼的解析的受害者,正如@MSalters在他的回答中指出的那样。