//用于实现根据宏参数个数重载宏定义
#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中未进行测试,不过应该可以通过。