C++ 可变宏-可选初始值设定项表达式

C++ 可变宏-可选初始值设定项表达式,c++,c++11,c-preprocessor,variadic-macros,C++,C++11,C Preprocessor,Variadic Macros,我想要一个宏,它声明一个带有给定名称和可选初始值设定项表达式的int 我试过使用,但没有成功 这就是我所尝试的: #define macro(...) int FIRST(__VA_ARGS__)(REST(__VA_ARGS__)) 这样使用时,没有问题: macro(foo); 但当给定初始值设定项时,会出现错误: macro(foo, 42); 当没有参数时,仅使用\uu VA\u ARGS\uu的替代方法会从GCC中的-pedantic发出警告 我怎样才能解决这个问题 如果没有初始

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

我试过使用,但没有成功

这就是我所尝试的:

#define macro(...) int FIRST(__VA_ARGS__)(REST(__VA_ARGS__))
这样使用时,没有问题:

macro(foo);
但当给定初始值设定项时,会出现错误:

macro(foo, 42);
当没有参数时,仅使用
\uu VA\u ARGS\uu
的替代方法会从GCC中的
-pedantic
发出警告

我怎样才能解决这个问题

如果没有初始值设定项表达式,也就是说没有零初始化,只有默认值,那么是否可以避免使用大括号

请注意,我的实际用例不仅适用于
int
,而且适用于任何类型,使用第三方(如boost)是不可取的

#define macro(...) int FIRST(__VA_ARGS__){REST(__VA_ARGS__)}
您的主要问题是
intfoo()是一个函数声明<代码>int foo{}不是


您的主要问题是
intfoo()是一个函数声明<代码>int foo{}不是

最后,我得出以下结论:

我将
\uu VA\u ARGS\uuuu
转发到一个可变模板,因为我的问题与我在这里描述的不完全一样(如评论中所建议的那样),但不提供初始值设定项时的问题仍然存在-因此我使用
\pragma GCC system\u header
\u pragma()
对于
-Wgnu零变量宏参数
。MSVC不是问题


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

最后我得出了以下结论:

我将
\uu VA\u ARGS\uuuu
转发到一个可变模板,因为我的问题与我在这里描述的不完全一样(如评论中所建议的那样),但不提供初始值设定项时的问题仍然存在-因此我使用
\pragma GCC system\u header
\u pragma()
对于
-Wgnu零变量宏参数
。MSVC不是问题


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

使用宏是很少有人推荐的,因为它们往往会混淆代码。你能详细说明一下你用这个解决方案试图解决的原始问题吗?为什么要这样使用宏?也许还有其他方法来解决你的解决方案,不依赖于宏的方式?你可以通过实际编写C++代码来修复这个问题,而不是试图使用这种粗糙、过时的C语法,并通过使用模板;在C++中,这是正确的方法。这是一个非常宽泛的话题,不适合作简短的回答;所以你需要做的是打开C++来讨论模板,然后开始阅读。C++不够强大,因此我需要求助于宏来生成代码。成千上万的项目依赖于预处理器。我知道这不是一个很好解决的问题,但我只是请求帮助-如果我没有得到它-它很好。为这个用例执行宏有什么意义<代码>intfoo=42更明确。你怎么知道C++“不够强大”?我们怎么知道?你的问题就是一个例子,你告诉我们一个你想要解决的问题,但不要告诉我们这个问题应该解决什么。仅仅因为成千上万的项目以一种可能不好的方式使用宏并不意味着你必须这样做。很少有人建议使用宏,因为它们会混淆代码。你能详细说明一下你用这个解决方案试图解决的原始问题吗?为什么要这样使用宏?也许还有其他方法来解决你的解决方案,不依赖于宏的方式?你可以通过实际编写C++代码来修复这个问题,而不是试图使用这种粗糙、过时的C语法,并通过使用模板;在C++中,这是正确的方法。这是一个非常宽泛的话题,不适合作简短的回答;所以你需要做的是打开C++来讨论模板,然后开始阅读。C++不够强大,因此我需要求助于宏来生成代码。成千上万的项目依赖于预处理器。我知道这不是一个很好解决的问题,但我只是请求帮助-如果我没有得到它-它很好。为这个用例执行宏有什么意义<代码>intfoo=42更明确。你怎么知道C++“不够强大”?我们怎么知道?你的问题就是一个例子,你告诉我们一个你想要解决的问题,但不要告诉我们这个问题应该解决什么。仅仅因为成千上万的项目以一种可能不好的方式使用宏并不意味着你也必须这样做。天哪,我已经完全忘记了恼人的解析——谢谢你指出这一点!天哪,我已经完全忘记了烦人的解析——谢谢你指出!