【语法】宏定义重载

本文介绍了如何在C语言中实现宏定义的重载,通过`GET_MACRO`技巧利用`VA_ARGS`来根据参数数量选择不同的宏进行展开。示例中展示了不同参数数量的宏调用如何被正确解析为相应的`F002`和`F003`。

参考:

https://stackoverflow.com/questions/11761703/overloading-macro-on-number-of-arguments?rq=1


#define GET_MACRO(_1,_2,_3,NAME,...) NAME
#define FOO(...) GET_MACRO(__VA_ARGS__, FOO3, FOO2)(__VA_ARGS__)

So if you have these macros:

FOO(World, !)         # expands to FOO2(World, !)
FOO(foo,bar,baz)      # expands to FOO3(foo,bar,baz)

If you want a fourth one:

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

其中VA_ARGS 就是: ···


F00(world,!)
解析为:
GET_MACRO(world,!,F003,F002)(world,!) 故:NAME 为F002

GET_MACRO(world,!,F003,F002) 被解析为F002

所以最终为F002(world,!)


F00(foo,bar,baz)
解析为:
GET_MACRO(foo,bar,baz,F003,F002)(foo,bar,baz) 故:NAME 为F003

GET_MACRO(foo,bar,baz,F003,F002) 被解析为F003

所以最终为F003(foo,bar,baz)


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值