我想记录函数的返回值。问题是该函数可能有许多退出点,我不想在每个退出点之前添加日志调用。
我想过有一个内心对象负责进行Log
调用。但是,我仍然必须在每个return
语句之前通知它有关返回值的信息。
我还想过创建一个在从函数返回之前调用记录器的宏。类似的东西:
#define RETURN(ret) Logger.log(__FUNCTION__, ret); return ret;
但我想避免这样做。
关于我如何能够轻松轻松地实现这一目标的任何其他想法?
由于
答案 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__
)。