可变参数宏 - 可选初始值设定项表达式
variadic macro - optional initializer expression
我想要一个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在他的回答中指出的那样。
相关文章:
- std::具有相同基类的类的变体
- (C++)分析树以计算返回错误值的简单算术表达式
- 访问者访问变体并返回不同类型时出错
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 提升精神:解析布尔表达式并简化为规范范式
- 我应该使用什么来代替void作为变体中的替代类型之一
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 使用正则表达式regex_search在字符串中查找字符串
- 将shared_ptr移动到<StructA>shared_ptr<变体<结构A、结构 B>>
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 如何比较自定义类的std::变体
- 通过网络、跨平台传递std::变体是否安全
- 概念中的cv限定符需要表达式参数列表
- 为什么constexpr的性能比正常表达式差
- 对于结构,表达式必须是可修改的ivalue
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 德语变音符号和正则表达式
- constexpr 对不变表达式的好处
- 用一个表达式包装变元宏中的每个元素
- 当C++lambda表达式有大量引用捕获时,未命名函数对象的大小就会变大