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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (13)

我有两个宏FOO2FOO3

#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)

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

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

提问于
用户回答回答于

简单如下:

#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)

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

用户回答回答于

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

#define GET_MACRO(_0, _1, _2, NAME, ...) NAME
#define FOO(...) GET_MACRO(_0, ##__VA_ARGS__, FOO2, FOO1, FOO0)(__VA_ARGS__)

扫码关注云+社区