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

C++ 按函数调用深度缩进打印日志的优化方案问询

调用栈深度匹配缩进打印实现方案

这里提供两种不同适配场景的实现方案,均满足同一函数内多次打印深度不会异常递增的需求:

方案1:无侵入编译器内置实现(无需修改业务函数)

利用主流编译器(GCC/Clang/新版MSVC)支持的栈帧获取内置函数,自动计算当前调用栈深度,不需要在业务函数入口添加任何额外代码,完全符合你给出的理想调用方式。

#include <iostream>
#include <string>

// 获取当前调用栈深度,根据实际封装层级调整偏移值即可
int get_call_depth() {
    int depth = 0;
    // 逐层遍历栈帧直到栈底
    while (__builtin_frame_address(depth) != nullptr) {
        depth++;
    }
    // 减去当前函数、funcX两层的占用,调整该值匹配你需要的基础深度
    return depth - 2;
}

void funcX(const std::string& msg) {
    int cur_depth = get_call_depth();
    // 按深度生成2倍长度的缩进
    std::cout << std::string(cur_depth * 2, ' ') << msg << "  // depth " << cur_depth << '\n';
}

// 业务代码无需任何修改,直接调用funcX即可
void func1(){
    funcX("name5");
}

void func2(){
    funcX("name0");
    funcX("name1");
    funcX("name2");
    funcX("name3");
    func1();
}

int main() {
    func2();
    return 0;
}

方案2:纯标准C++兼容实现(仅需函数首行加一行宏)

如果需要兼容所有C++编译环境,不依赖编译器内置接口,可以用RAII守卫+宏的方式实现,仅需在函数开头添加一行宏声明,同一函数内多次调用funcX深度不会变化:

#include <iostream>
#include <string>

class CallDepthGuard {
    // C++17及以上支持inline静态变量,低版本C++需要移到类外定义
    static inline int s_depth = 0;
public:
    CallDepthGuard() { ++s_depth; }
    ~CallDepthGuard() { --s_depth; }
    static int get_depth() { return s_depth; }
};

// 函数入口添加该宏即可自动维护深度
#define AUTO_DEPTH_GUARD CallDepthGuard __auto_depth_guard__;

void funcX(const std::string& msg) {
    int cur_depth = CallDepthGuard::get_depth();
    std::cout << std::string(cur_depth * 2, ' ') << msg << "  // depth " << cur_depth << '\n';
}

// 业务代码仅需添加一行宏
void func1(){
    AUTO_DEPTH_GUARD;
    funcX("name5");
}

void func2(){
    AUTO_DEPTH_GUARD;
    funcX("name0");
    funcX("name1");
    funcX("name2");
    funcX("name3");
    func1();
}

int main() {
    AUTO_DEPTH_GUARD;
    func2();
    return 0;
}

两种方案对比

  • 方案1优势:业务代码零侵入,不需要添加任何额外声明,使用最便捷;劣势:依赖编译器内置接口,深度偏移需要根据实际封装层级调整。
  • 方案2优势:纯标准C++语法,无编译环境依赖,深度计算准确;劣势:需要在每个用到funcX的函数首行添加一行宏声明,额外开发成本极低。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 05:36:06