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
相关产品推荐
相关产品推荐

