【发布时间】:2012-12-16 16:01:40
【问题描述】:
我正在用 C++ 实现一个日志处理程序,它工作得很好,但是我发现有一件事是有用的,那就是记录器从哪里获得输出。
我想这并不是什么大问题,但我偶然发现了__func__ 标识符,它基本上会保留当前函数的函数名。
所以我的日志类中有一个名为Write 的静态函数,它需要一个日志级别和一个变化列表。所以我会这样称呼它:
Log::Write(LOG_DEBUG, "this is an integer: %d", 10);
它会打印出来:
2013-01-02 => 10:12:01.366 [DEBUG]: this is an integer: 10
但是我认为在消息中也包含调用者可能会很有用,以产生如下内容:
2013... => 10:12:... (functionName) [DEBUG]: blah
所以我可以做的(当然)是将__func__ 作为参数添加到Log::Write,但这意味着任何时候我调用Log::Write 我还需要发送__func__,这将始终是一样的,我觉得应该可以在没有明确说明的情况下这样做。
所以我想要的是将提供的功能:
Log::Write(LOG_DEBUG, __func__, "message");
无需每次都明确输入 func。
我不知道这是否真的可能,我最好的选择是有一些方法可以取消引用函数 Write 内部的调用者,我似乎不太可能只是“推断”这样的参数。但至少值得一问,也许我可以看到有哪些选择。
谢谢。
【问题讨论】:
-
这是“传统上”用宏完成的。
-
C++ 中没有
__func__标识符;它是对 C99 的补充,而 C++ 没有采用。我怀疑大多数 C++ 编译器会将其作为扩展提供(因为它们也是 C 编译器),但微软没有,而且我的经验表明__FUNCTION__尽管不是标准的一部分,但实际上更便携。跨度> -
我相信
__func__标识符是 C++11 添加的,基本上它可用于任何函数并包含当前函数的名称。但是我可能错了,但这是我的理解。
标签: c++ logging callstack func