gpt4 book ai didi

c++ - C++ 中的缩进跟踪

转载 作者:可可西里 更新时间:2023-11-01 11:02:53 24 4
gpt4 key购买 nike

我想为我们的大型 C++ 代码库开发缩进跟踪,这将特别有助于开发人员发现问题。我想要缩进跟踪功能。例如,考虑以下代码:-

 void FunctionA()
{
TR_ENTER("Function A");
TR_PRINT("Dignostic message Function A");
FunctionB(); // Call function B
}

void FunctionB()
{
TR_ENTER("Function B");
TR_PRINT("Dignostic message Function B");
FunctionC(); // Call function B
}

void FunctionC()
{
TR_ENTER("Function C");
TR_PRINT("Dignostic message Function C");
}

如您所见,上述调用相互嵌套。我想生成如下所示的跟踪日志:

Function A - Start
Dignostic message Function A
Function B - Start
Dignostic message Function B
Function C - Start
Dignostic message Function C
Function C - End
Function B - End
Function A - End

TR_ENTER 和 TR_PRINT 是我用作示例的一些宏。要说函数开始我使用了 TR_ENTER 并且为了打印一些诊断消息我使用了 TR_PRINT。

如您所见,嵌套函数调用的轨迹相互缩进。我可以知道是否有任何可用的东西,以便我可以防止自己重新发明轮子。

谢谢,好吧

最佳答案

您需要跟踪调用深度:

class trace_entry;

class trace_log {
public:
trace_log() : depth_(0) { }

private:
// noncopyable so we don't accidentally copy it
trace_log(trace_log&);
void operator=(trace_log);

friend trace_entry;

int depth_;
};

class trace_entry {
public:
trace_entry(trace_log& log, const std::string& frame)
: log_(log), frame_(frame) {
std::cout << std::string(4 * log.depth_, ' ')
<< "ENTER " << frame_ << std::endl;
++log_.depth_;
}

~trace_entry() {
--log_.depth_;
std::cout << std::string(4 * log_.depth_, ' ')
<< "EXIT " << frame_ << std::endl;
}
private:
// noncopyable so we don't accidentally copy it
trace_entry(trace_entry&);
void operator=(trace_entry);

trace_log& log_;
std::string frame_;
};

使用示例:

void a(trace_log& log) {
trace_entry e(log, "a");
}

void b(trace_log& log) {
trace_entry e(log, "b");
return a(log);
}

int main() {
trace_log log;
trace_entry e(log, "main");
b(log);
}

输出:

ENTER main
ENTER b
ENTER a
EXIT a
EXIT b
EXIT main

这很容易扩展以支持替代形式的日志记录,允许额外的日志消息,以及几乎任何你想做的事情。 (让 trace_log 实际执行日志记录会好得多,但出于说明目的,这是演示您正在尝试执行的操作的最简单方法。)

关于c++ - C++ 中的缩进跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6211038/

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