我想记录一个函数的返回值。问题是函数可能有很多退出点,我不想在每个退出点之前添加日志调用。
我想过有一个内部对象负责进行 Log
调用。但是,我仍然必须在每个 return
语句之前通知它有关返回值的信息。
我还考虑过创建一个在从函数返回之前调用记录器的宏。像这样的东西:
#define RETURN(ret) Logger.log(__FUNCTION__, ret); return ret;
但我想避免这样做。
关于如何轻松轻松地实现这一点,我还有其他想法吗?
谢谢
最佳答案
我不认为你可以更好更轻松地做到这一点。在这种情况下,我认为对源影响最小的解决方案是使用预处理器,但你不应该按照你的方式去做,因为它内置了超价。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__
)。
关于c++ - 记录函数的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33147175/