You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++如何获取当前函数的调用栈深度并打印对应调用层级

C++ 函数调用链深度统计实现方案

核心采用RAII机制自动维护调用深度,每个函数仅需添加1行代码即可实现要求的打印效果:

完整实现代码

#include <iostream>
#include <string>

// 线程局部的调用深度计数器,多线程场景下互不干扰
thread_local int g_call_depth = 0;

class CallDepthTracer {
public:
    explicit CallDepthTracer(const char* func_name): m_func(func_name) {
        // 按深度打印缩进、函数名和深度标注
        std::cout << std::string(g_call_depth * 2, ' ') << m_func << " // depth " << g_call_depth << "\n";
        g_call_depth++;
    }
    ~CallDepthTracer() {
        g_call_depth--;
    }
private:
    std::string m_func;
};

// 所有业务函数开头添加一行即可
void func7() { CallDepthTracer tracer(__func__); }
void func6() { CallDepthTracer tracer(__func__); func7(); }
void func5() { CallDepthTracer tracer(__func__); func6(); }
void func8() { CallDepthTracer tracer(__func__); }
void func4() { CallDepthTracer tracer(__func__); func5(); func8(); }
void func3() { CallDepthTracer tracer(__func__); }
void func2() { CallDepthTracer tracer(__func__); func3(); }
void func1() { CallDepthTracer tracer(__func__); }
void func9() { CallDepthTracer tracer(__func__); }
void func0() { CallDepthTracer tracer(__func__); func1(); func2(); func4(); }

int main() {
    func0();
    func9();
    return 0;
}

方案说明

  • 利用C++ RAII特性自动处理深度的增减,即使函数中途抛出异常也不会出现计数错误
  • 计数器使用thread_local修饰,多线程环境下各线程的调用链深度独立统计,不会互相冲突
  • 内置的__func__是C++11标准宏,可自动获取当前函数名,不需要手动填写
  • 运行后输出结果和你给出的层级示例完全一致

内容的提问来源于stack exchange,提问作者Alejandro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 02:27:02