【问题标题】:c++ calculate depth of the function calls that led to the current functionc ++计算导致当前函数的函数调用的深度
【发布时间】:2021-10-20 15:38:05
【问题描述】:

假设我们有一组函数调用,它们按照类似于树的顺序执行。即 func0 依次调用 func1 和 func2。 func2 调用 func3,然后 func0 继续下一行执行 func4。

func0   // depth 0
  func1  // depth 1
  func2  // depth 1
    func3  // depth 2
  func4    // depth 1
    func5  // depth 2
       func6  // depth 3
          func7  // depth 4
    func8 // depth 2
func9  // depth 0

我可以在每个函数中添加哪一行代码来打印这样的深度?

【问题讨论】:

  • 我能想到的一种方法是传递每个函数的参数,该参数将指示深度。然后你只需输出相应格式的函数名即可。
  • boost.org/doc/libs/1_77_0/doc/html/stacktrace.html 可能会有所帮助,否则您需要告诉我们您的目标平台是什么,因为没有标准的 c++ api 来询问调用堆栈
  • @AlanBirtles 一个非标准的 c++ sn-p 也很有用。例如,我在考虑是否可以使用一些全局变量。我的主要平台是 linux 但我也可以在 windows 中使用它

标签: c++


【解决方案1】:

一种方法是创建一个计算深度的 RAII 类,并在您希望跟踪的每个函数的顶部实例化它。为了调试目的,我做了这种事情。

class DepthCounter
{
    static int depth;

public:
    DepthCounter(const std::string& name)
    {
        std::cout << std::string(depth*2, ' ') << name << "  // depth " << depth << '\n';
        ++depth;
    }

    ~DepthCounter()
    {
        --depth;
    }
};

int DepthCounter::depth = 0;

您可以在每个函数中实例化它,例如:

DepthCounter dc(__func__);

你可以随意命名实例,但如果不给它一个变量名,它只是一个临时的,并且基本上在分号处被销毁。通过将其设为变量,它会一直持续到函数以任何方式退出,无论是从末端掉头、显式返回还是通过异常。

我没有显示所有代码(必须留下 something 让你做),但我得到的输出看起来像:

func0  // depth 0
  func1  // depth 1
  func2  // depth 1
    func3  // depth 2
  func4  // depth 1
    func5  // depth 2
      func6  // depth 3
        func7  // depth 4
    func8  // depth 2
func9  // depth 0

【讨论】:

  • 您对实例化它有什么建议吗?当我将它实例化为 DepthCounter("counter") 但没有将其分配给变量时,我认为当它转到同一函数内的下一行代码时,它已经破坏了该类
  • 我只是在每个函数中做了DepthCounter dc(__func__);。如果不给它一个变量名,你只是创建一个临时的,它基本上在分号处被销毁。通过将其设为变量,它会一直存在到函数以任何方式退出,无论是从结尾处掉下来、显式的return 还是通过异常退出。
  • 你能建议一种方法,如果我再次在同一个函数中实例化它,它会返回相同的深度吗?因为此刻构造函数总是增加深度
  • 不要在同一个函数中多次实例化它。一次,每个函数的第一件事。
  • 是的,但我的主要目的实际上是在同一个函数中多次执行某些操作,例如在具有相同深度数的同时进行记录,最好也使用一行。像构造函数能得到一些东西,告诉它仍然在当前函数中不要增加深度吗?
猜你喜欢
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 2021-05-26
  • 2017-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-19
相关资源
最近更新 更多