【问题标题】:Logging the return value of a function记录函数的返回值
【发布时间】:2015-08-20 08:39:48
【问题描述】:

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

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

我还考虑过在从函数返回之前创建一个调用记录器的宏。比如:

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

但我想避免这样做。

对于如何轻松轻松地实现这一目标还有其他想法吗?

谢谢

【问题讨论】:

  • 为什么不让调用者记录返回值?
  • 函数是从 DLL 导出的。我希望 DLL 记录所有 API 调用。
  • @user 如果是 MSVC,有一种自动的方法可以做到这一点,但它绝对不是好和容易(相反它是顽皮和困难的)。可以生成一个 DLL 包装另一个并拦截所有调用。

标签: c++ logging


【解决方案1】:

我认为您不能更轻松、更轻松地做到这一点。在这种情况下,我认为对源代码影响最小的解决方案是使用预处理器,但你不应该按照你的方式去做,因为它内置了超值。Fx:

if( done )
    RETURN(something);

扩展到:

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

这意味着如果done 为真,则将something 发送到日志,然后无论如何返回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__)。

【讨论】:

  • 只是一个注释,但__func__实际上并不是一个宏,而是一个变量。
猜你喜欢
  • 1970-01-01
  • 2018-10-10
  • 2019-02-14
  • 2020-11-23
  • 1970-01-01
  • 2017-10-14
  • 1970-01-01
  • 2023-01-07
  • 2021-02-19
相关资源
最近更新 更多