我希望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这样的第三方不是一种选择。
答案 0 :(得分:5)
#define macro(...) int FIRST(__VA_ARGS__){REST(__VA_ARGS__)}
你的主要问题是int foo();
是一个函数声明。 int foo{};
不是status
。
答案 1 :(得分:0)
最后我得到了以下内容:link
我将__VA_ARGS__
转发到可变参数模板,因为我的问题并不完全是我在这里所描述的(正如评论中所建议的那样) - 但是没有提供初始化程序的问题仍然存在 - 所以我让GCC标题中包含#pragma GCC system_header
的警告,而对于Clang我使用_Pragma()
表示-Wgnu-zero-variadic-macro-arguments
。 MSVC不是问题。
@MSalters在答案中指出,我也成了最令人烦恼的解析的牺牲品。