我有两个宏FOO2
和FOO3
:
#define FOO2(x,y) ...
#define FOO3(x,y,z) ...
我想要定义一个新的宏FOO
,如下所示:
#define FOO(x,y) FOO2(x,y)
#define FOO(x,y,z) FOO3(x,y,z)
但是这不起作用,因为宏不会超过参数的数量。
无需修改FOO2
和FOO3
,是有一些方法来定义一个宏FOO
(使用__VA_ARGS__
或以其他方式),以获得分派的相同的效果FOO(x,y)
来FOO2
,并FOO(x,y,z)
到FOO3
?
发布于 2018-03-23 15:56:37
简单如下:
#define GET_MACRO(_1,_2,_3,NAME,...) NAME
#define FOO(...) GET_MACRO(__VA_ARGS__, FOO3, FOO2)(__VA_ARGS__)
所以如果你有这些宏:
FOO(World, !) # expands to FOO2(World, !)
FOO(foo,bar,baz) # expands to FOO3(foo,bar,baz)
如果你想要第四个:
#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)
当然,如果你定义FOO2
,FOO3
并且FOO4
,输出将由本定义的宏所取代。
发布于 2018-03-23 17:15:37
实际上可以在gcc的帮助下使用0参数宏来完成这一任务。##__VA_ARGS__
延期:
#define GET_MACRO(_0, _1, _2, NAME, ...) NAME
#define FOO(...) GET_MACRO(_0, ##__VA_ARGS__, FOO2, FOO1, FOO0)(__VA_ARGS__)
https://stackoverflow.com/questions/-100003679
复制相似问题