记录函数的返回值

时间:2015-08-20 08:39:48

标签: c++ logging

我想记录函数的返回值。问题是该函数可能有许多退出点,我不想在每个退出点之前添加日志调用。

我想过有一个内心对象负责进行Log调用。但是,我仍然必须在每个return语句之前通知它有关返回值的信息。

我还想过创建一个在从函数返回之前调用记录器的宏。类似的东西:

#define RETURN(ret) Logger.log(__FUNCTION__, ret); return ret;

但我想避免这样做。

关于我如何能够轻松轻松地实现这一目标的任何其他想法?

由于

1 个答案:

答案 0 :(得分:3)

我不认为你可以更好,更轻松地做到这一点。在这种情况下,我认为对源代码影响最小的解决方案是使用预处理器,但是你不应该像你那样做,因为它有内置的代号.Fx:

if( done )
    RETURN(something);

扩展为:

if( done )
    Logger.log("function_name", something); return something;

这意味着如果something为真,done会发送到日志,无论如何都会返回something

为了使扩展适合单个语句,它通常包含在do { ... } while(0)中,这将使该示例记录并仅在done为真时返回。

但是由于宏参数被扩展了两次仍然是一个惊喜,考虑你写RETURN(something++);然后它会扩展到Logger.log(__FUNCTION__, something++); return something++;的情况,这意味着不幸的副作用。这在C中是一个真正的问题,但在C ++中却不是。这里的模板很方便:

 template<typename T>
 T const& log_and_return(char const* func, const T& value)
 {
      Logger.log(func, value);
      return value;
 }

 #define RETURN(value) return log_and_return(__func__, value)

请注意,它在标准中称为__func__ __FUNCTION__)。