variadic macro - 可选的初始化表达式

时间:2017-03-20 10:26:06

标签: c++ c++11 c-preprocessor variadic-macros

我希望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这样的第三方不是一种选择。

2 个答案:

答案 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在答案中指出,我也成了最令人烦恼的解析的牺牲品。