推迟对函数调用参数的评估

时间:2014-01-20 23:28:13

标签: c++ c++11 argument-passing

我编写了一个带有两个或更多参数的小型日志记录类:

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的这个问题?

1 个答案:

答案 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)