记录函数返回值的日志

3
我想记录函数的返回值,但是函数有很多出口点,我不想在每个出口点都添加一个日志记录调用。我考虑创建一个内部对象,负责进行Log调用。但是,必须在每个return语句之前通知它关于返回值。 我还考虑过创建一个宏,在从函数返回之前调用记录器。例如:
#define RETURN(ret) Logger.log(__FUNCTION__, ret); return ret;

但我希望避免这样做。

你有没有其他想法,可以让我轻松地实现它呢?

谢谢。


2
为什么不让调用者记录返回值? - Giorgi Moniava
1
该函数从DLL中导出。我希望DLL记录所有API调用。 - Mr. Anderson
1
@user 如果是MSVC,有一种自动的方法可以做到这一点,但绝对不是简单易行的(相反,它是淘气和困难的)。可以生成一个包装其他DLL并拦截所有调用的DLL。 - skyking
1个回答

3

我认为你无法更加优雅和轻松地实现这一点。在这种情况下,我认为对源代码影响最小的解决方案是使用预处理器,但你不应该像你这样做,因为这样做可能会造成意外后果。例如:

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__ 实际上不是宏,而是一个变量。 - Some programmer dude

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接