可变参数宏 - 可选的初始化表达式
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 在他的回答中指出的那样,我也成为了最令人烦恼的解析的受害者。
我想要一个 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 在他的回答中指出的那样,我也成为了最令人烦恼的解析的受害者。