可变参数宏 - 可选的初始化表达式

variadic macro - optional initializer expression

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

我尝试使用 this answer on Stack Overflow 但没有成功。

这是我试过的:

#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{}; 不是。

最后我得到了以下结果:link

我将 __VA_ARGS__ 转发到一个可变参数模板,因为我的问题与我在这里描述的不完全一样(如评论中所建议的)——但在不提供初始化程序时问题仍然存在——所以我沉默了header 中的 GCC 警告 #pragma GCC system_header 和 Clang 我使用 _Pragma() 代替 -Wgnu-zero-variadic-macro-arguments。 MSVC 不是问题。

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