首页 > 解决方案 > c ++计算导致当前函数的函数调用的深度

问题描述

假设我们有一组函数调用,它们按照类似于树的以下顺序执行。即 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

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

标签: c++

解决方案


一种方法是创建一个计算深度的 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__);

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

我没有显示所有代码(必须为你留下一些东西),但我得到的输出看起来像:

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

推荐阅读