【问题标题】:Deferring evaluation of function-call arguments推迟对函数调用参数的评估
【发布时间】:2014-01-20 23:28:12
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案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)

    【讨论】:

    • 我不知道宏可以使用可变参数......这会起作用。我将把问题留待更长时间,看看是否有任何非预处理器解决方案。
    猜你喜欢
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    • 2018-08-01
    • 2010-11-26
    • 1970-01-01
    • 2018-05-31
    相关资源
    最近更新 更多