我已经为我的库中的统一日志记录编写了简单的记录器。 我现在拥有的:
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)
我知道我可以通过使用普通函数重载轻松解决这个问题,但我真的希望让日志系统具有最小的开销,因此使用了允许我在编译时连接字符串的定义。
有什么想法吗?
答案 0 :(得分:0)
您可以检查Log
函数中的输入参数的数量。如果没有,则只需使用fputs
代替vfprintf
。