c++ - 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
我可以在这些函数中的每一个中放入哪一行代码来打印这样的深度?
解决方案
一种方法是创建一个计算深度的 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
推荐阅读
- javascript - Formik + React Form中的下拉列表和值未更新
- node.js - 无法使用 listSources 或 listCards 方法检索卡片
- mysql - 如何在 3 列中找到最好的 2 列和这 2 列的平均值
- git - 如何在 zsh 中完成“git add”完整路径?
- sorting - 以 rust 打印 NBA MVP 名单
- mockito - 如何模拟使用反射创建的对象构造,即 newInstance() 方法
- ruby-on-rails - 在 Rails 的设计中添加复选框以编辑用户的布尔值
- ruby-on-rails - 每个循环都没有为每个条目返回正确的数量
- sql - 无法弄清楚这个程序是如何工作的,得到一个我无法理解的奇怪错误
- json - Linux命令打印相同键的所有json