gpt4 book ai didi

c++ - __func__ 和日志记录

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:15:05 25 4
gpt4 key购买 nike

我正在用 C++ 实现一个日志处理程序,它工作得很好,但是我发现有一件事是可用的,那就是记录器从中获取输出的地方。

我想这并不是什么大问题,但我偶然发现了 __func__ 标识符,它基本上会保留当前函数的函数名称。

所以我在我的 Log 类中有一个名为 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 中取消引用调用者,这似乎不太可能我可以“推断”这样的参数。但至少值得一问,也许我可以看看有哪些选择。

谢谢。

最佳答案

这通常使用宏以及文件名 __FILE__ 来完成和行号 __LINE__ .

void Log::Write(Level l,
char const* function,
char const* file,
int line,
char const* format,
...);

被包裹成一个宏:

#define LOG(Level_, Format_, ...) \
Log::Write(Level_, __func__, __FILE__, __LINE__, Format_, __VA_ARGS__);

请注意,您可能希望通过检查是否在该级别登录来“节省”一些计算:

// suppose availability of "bool Log::Enabled(Level l)"
#define LOG(Level_, Format_, ...) \
while (Log::Enabled(Level_)) { \
Log::Write(Level_, __func__, __FILE__, __LINE__, Format_, __VA_ARGS__); \
break; \
}

使用while而不是 if是为了避免悬空的 else 问题。

注意:您可能希望研究使用流进行日志记录。 printf 的问题风格是它不可组合。使用流,您可以重载 std::ostream& operator<<(std::ostream&, X const&)对于任何 X然后只编写一次方法将其内容转储到日志中。

关于c++ - __func__ 和日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14119469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com