首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在参数数量上重载宏?

如何在参数数量上重载宏?
EN

Stack Overflow用户
提问于 2018-03-23 07:37:50
回答 2查看 0关注 0票数 0

我有两个宏FOO2FOO3

代码语言:javascript
复制
#define FOO2(x,y) ...
#define FOO3(x,y,z) ...

我想要定义一个新的宏FOO,如下所示:

代码语言:javascript
复制
#define FOO(x,y) FOO2(x,y)
#define FOO(x,y,z) FOO3(x,y,z)

但是这不起作用,因为宏不会超过参数的数量。

无需修改FOO2FOO3,是有一些方法来定义一个宏FOO(使用__VA_ARGS__或以其他方式),以获得分派的相同的效果FOO(x,y)FOO2,并FOO(x,y,z)FOO3

EN

回答 2

Stack Overflow用户

发布于 2018-03-23 15:56:37

简单如下:

代码语言:javascript
复制
#define GET_MACRO(_1,_2,_3,NAME,...) NAME
#define FOO(...) GET_MACRO(__VA_ARGS__, FOO3, FOO2)(__VA_ARGS__)

所以如果你有这些宏:

代码语言:javascript
复制
FOO(World, !)         # expands to FOO2(World, !)
FOO(foo,bar,baz)      # expands to FOO3(foo,bar,baz)

如果你想要第四个:

代码语言:javascript
复制
#define GET_MACRO(_1,_2,_3,_4,NAME,...) NAME
#define FOO(...) GET_MACRO(__VA_ARGS__, FOO4, FOO3, FOO2)(__VA_ARGS__)

FOO(a,b,c,d)          # expeands to FOO4(a,b,c,d)

当然,如果你定义FOO2FOO3并且FOO4,输出将由本定义的宏所取代。

票数 0
EN

Stack Overflow用户

发布于 2018-03-23 17:15:37

实际上可以在gcc的帮助下使用0参数宏来完成这一任务。##__VA_ARGS__延期:

代码语言:txt
复制
#define GET_MACRO(_0, _1, _2, NAME, ...) NAME
#define FOO(...) GET_MACRO(_0, ##__VA_ARGS__, FOO2, FOO1, FOO0)(__VA_ARGS__)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100003679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档