巧妙利用宏定义-实现宏定义重载

//用于实现根据宏参数个数重载宏定义
#define PRIVATE_MACRO_VAR_ARGS_IMPL_COUNT(_1,_2,_3,_4,_5,_6,_7,_8,_9, N, ...) N
#define PRIVATE_MACRO_VAR_ARGS_IMPL(args)  PRIVATE_MACRO_VAR_ARGS_IMPL_COUNT args
#define COUNT_MACRO_VAR_ARGS(...)  PRIVATE_MACRO_VAR_ARGS_IMPL((__VA_ARGS__,10,9,8,7,6,5 4,3,2,1,0))
#define PRIVATE_MACRO_CHOOSE_HELPER2(M, count)  M##count
#define PRIVATE_MACRO_CHOOSE_HELPER1(M, count)   PRIVATE_MACRO_CHOOSE_HELPER2(M, count)
#define PRIVATE_MACRO_CHOOSE_HELPER(M, count)   PRIVATE_MACRO_CHOOSE_HELPER1(M, count)
#ifdef WIN32
//用于解决 windows 上将__VA_ARGS__展开成一个参数的问题
#define EXPAND(...) __VA_ARGS__
#define MACRO_CHOOSE(PreName,...) EXPAND(PRIVATE_MACRO_CHOOSE_HELPER(PreName, COUNT_MACRO_VAR_ARGS( __VA_ARGS__))( __VA_ARGS__))
#else
#define MACRO_CHOOSE(PreName,...) PRIVATE_MACRO_CHOOSE_HELPER(PreName, COUNT_MACRO_VAR_ARGS( __VA_ARGS__))( __VA_ARGS__)
#endif

使用示例:

#define LogInfo_1(logInfo)  ELog::Instance().Log(logInfo,1,__LINE__,__FILE__,__FUNCTION__)

#define LogInfo_2(logInfo,level)  ELog::Instance().Log(logInfo,level,__LINE__,__FILE__,__FUNCTION__)

#define LogWarning_1(logInfo)  ELog::Instance().Warning(logInfo,1,__LINE__,__FILE__,__FUNCTION__)

#define LogWarning_2(logInfo,level)  ELog::Instance().Warning(logInfo,level,__LINE__,__FILE__,__FUNCTION__)


#define LogError(logInfo)  ELog::Instance().LogError(logInfo,__LINE__,__FILE__,__FUNCTION__)

#define LogInfo(...) MACRO_CHOOSE(LogInfo_,__VA_ARGS__)

#define LogWarning(...) MACRO_CHOOSE(LogWarning_,__VA_ARGS__)

上述示例在vs2019中可以通过编译,gcc中未进行测试,不过应该可以通过。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值