我可以在中间而不是末尾定义可变 C 预处理器宏吗?
如果我这样做,GCC 会抱怨:
#define M(obj,met, ..., contents) obj##_##met(const void * self, __VA_ARGS__) { \
contents \
}
给我两个原因:
error: missing ')' in macro parameter list
warning: __VA_ARGS__ can only appear in the expansion of a C99 variadic macro
显然,C99 风格的可变参数宏期望在省略号之后立即使用右括号,实际上要求可变参数列表是宏的最后一个参数。我需要它位于中间才能生成上面宏中描述的速记符号。 GCC 是否支持此功能,使用另一种(非 C99)可变参数宏样式?我可以用其他方式模仿它吗?我不希望最后有可变参数列表,它会让我的符号变得混乱。而且我只能使用GCC。
GCC complains if I do this:
#define M(obj,met, ..., contents) obj##_##met(const void * self, __VA_ARGS__) { \
contents \
}
Giving me these 2 reasons:
error: missing ')' in macro parameter list
warning: __VA_ARGS__ can only appear in the expansion of a C99 variadic macro
Apparently, C99 - style variadic macros expect the closing parenthesis immediately after the ellipsis, effectively demanding that the variadic list be the last arguments of the macro. I need it to be in the middle to produce my shorthand notation described in the above macro. Does GCC support this feature, using another (non-C99) variadic macro style? Can I emulate it doing it someway else? I don't want the variadic list at the end, it will make my notation confusing. And I can only use GCC.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
不,你不能。
...
必须出现在末尾。但是您可以将
M
定义为并将其用作
No you can't. The
...
must appear at the end.But you could define
M
asand use it as
您必须将
...
放在末尾,但是使用LAST
和POP_LAST
宏,您可以为您的宏并按如下方式定义它:以下是定义这些宏的方法:
这些宏最多适用于 8 个参数。如果您愿意,您可以轻松扩展它们以处理更多内容。
You have to put the
...
at the end, but usingLAST
andPOP_LAST
macros, you can keep the same order of arguments for your macro and define it like this:Heres how you can define these macros:
These macros will work for up to 8 arguments. You can easily extend them to handle more if you like.