C ++定义参数重载

时间:2015-07-31 10:59:57

标签: c++ overloading

我已经为我的库中的统一日志记录编写了简单的记录器。 我现在拥有的:

enum LogLevel {
    DEBUG,
    INFO,
    WARNING,
    ERROR
};

//this calls vfprintf(...)
void Log( LogLevel level, const char * format, ...);

//compile time log string concatenation, if logs should be disabled define NO_LOGS during compilation
#ifndef NO_LOGS
    #define LOG(LEVEL, MSG, ...) Log(LEVEL, "[" #LEVEL "] " MSG "\n", ##__VA_ARGS__)
#else
    #define LOG(LEVEL, MSG, ...)
#endif

//defines for fast logging
#define LOGD(MSG, ...) LOG(DEBUG, MSG, ##__VA_ARGS__)
#define LOGI(MSG, ...) LOG(INFO, MSG, ##__VA_ARGS__)
#define LOGW(MSG, ...) LOG(WARNING, MSG, ##__VA_ARGS__)
#define LOGE(MSG, ...) LOG(ERROR, MSG, ##__VA_ARGS__)

这很棒,但我有一个问题。虽然调用LOGI("log value %d", value)按预期工作,但无法调用LOGI("simple log msg")而是调用LOGI("%s","simple log msg"),这看起来很糟糕。是否有可能在定义中解决这个问题?我已经尝试了以下代码,但它没有编译,因为在C ++中无法基于参数定义重载。

#define LOGD(MSG, ...) LOG(DEBUG, MSG, ##__VA_ARGS__)
#define LOGD(MSG) LOG(DEBUG, "%s", MSG)

我知道我可以通过使用普通函数重载轻松解决这个问题,但我真的希望让日志系统具有最小的开销,因此使用了允许我在编译时连接字符串的定义。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您可以检查Log函数中的输入参数的数量。如果没有,则只需使用fputs代替vfprintf