我编写了一个带有两个或更多参数的小型日志记录类:
void my_log(int level, pattern [, fillins...]);
(模式和填充以类似sprintf的方式处理。)
my_log
的实施开始:
if ( level < _min_level ) return;
我认为这会使对very_elaborate_representation()
...
my_log(DEBUG, "%s", my_object.very_elaborate_representation());
当 _min_level 大于 DEBUG 时。
但事实并非如此:显然(并不奇怪)在函数调用之前会对参数进行求值。
格式化很昂贵,仅用于调试和故障排除。
除了用if-test包装调用之外,有没有一种干净的方法可以解决C ++ 11的这个问题?
答案 0 :(得分:1)
不确定它是否有帮助,但这是我以前实施日志记录模块的方式:
在标题文件中:
#define LOG(level,...) do {if (level >= MIN_LEVEL) log_printf(__VA_ARGS__);} while (0)
void log_printf(const char* data,...);
在源文件中:
void log_printf(const char* data,...)
{
char str[64] = {0}; // You can think of other ways for allocating it
va_list args;
va_start(args,data);
vsnprintf(str,sizeof(str),data,args);
va_end(args);
printf(str);
}
要发出日志消息,您只需拨打LOG(SOME_LEVEL,some-parameters)
。