当前位置:

首页 > 编程开发 > C++20 std::source_location使用教程

C++20 std::source_location使用教程

std::source_location在C++20中用于自动捕获文件名、行号、函数名等源码信息,通过current()获取调用点位置,支持日志和断言中无需手动传入__FILE__、__LINE__,提升调试效率。

本文目录

    std::source_location在C++20中用于自动捕获文件名、行号、函数名等源码信息,通过current()获取调用点位置,支持日志和断言中无需手动传入__FILE__、__LINE__,提升调试效率。

    C++的std::source_location如何使用_C++20中用于日志和断言的源码信息捕获

    在C++20中,std::source_location 是一个轻量级的类,用于在编译时捕获源代码的上下文信息,比如文件名、行号、函数名等。它非常适合用在日志记录、断言、调试输出等场景,避免手动传入 __FILE__、__LINE__ 等宏。

    基本特性与成员函数

    std::source_location 提供了以下只读访问接口:

    • file_name():返回当前源文件路径(const char*)
    • line():返回当前行号(unsigned int)
    • column():返回列号(通常实现为1或未完全支持)
    • function_name():返回所在函数名(const char*),通常是经过修饰的名称(mangled)

    这个类型是隐式构造的,通常通过 std::source_location::current() 获取当前位置信息,且该调用不会产生运行时开销(在优化后基本被常量替代)。

    如何使用 source_location 记录日志

    你可以将 std::source_location 作为默认参数传入日志函数,自动捕获调用点信息:

    #include 
    #include 
    #include 
    

    void log(std::string_view message, std::source_location loc = std::source_location::current()) { std::cout << "[" << loc.file_name() << ":" << loc.line() << "] " << loc.function_name() << " - " << message << '\n'; }

    void some_function() { log("Something happened!"); // 输出: [main.cpp:xx] some_function - Something happened! }

    注意:由于 function_name() 返回的是编译器内部的函数签名(可能包含模板、重载信息并被 mangling 处理),实际显示可能不够友好。可结合工具如 c++filt 解析,或仅用于调试。

    在断言中使用 source_location 提供更详细的错误信息

    自定义断言宏可以利用 source_location 避免重复写文件和行号:

    #include 
    #include 
    #include 
    

    void assertion_failed(const std::source_location& loc) { std::cerr << "Assertion failed at " << loc.file_name() << ":" << loc.line() << " in " << loc.function_name() << "\n"; std::abort(); }

    define MY_ASSERT(expr) \

    do { \
        if (!(expr)) { \
            assertion_failed(std::source_location::current()); \
        } \
    } while(0)

    void test() { MY_ASSERT(2 + 2 == 5); // 输出: Assertion failed at test.cpp:xx in test }

    这种方式比传统宏组合更简洁,也更容易维护。

    注意事项与限制

    • 编译器支持:需 C++20 支持,GCC 10+、Clang 10+、MSVC 19.29+ 基本可用
    • 函数名可读性:function_name() 返回值可能很长且难读,不适合直接展示给终端用户
    • 不能跨线程保存:虽然 source_location 是普通类型,但其内容依赖于调用点,若延迟使用仍反映原始位置
    • 默认参数限制:只能在函数调用时自动填充,无法在 lambda 或某些泛型上下文中直接捕获(除非显式传参)

    基本上就这些。std::source_location 让日志和诊断信息变得更清晰、更自动化,是 C++20 中提升调试体验的小而美的特性。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    全面深入了解C++20 范围库(std::ranges)
    全面深入了解C++20 范围库(std::ranges)

    C++20范围库以概念、范围、视图、管道语法和投影为核心,升级传统STL迭代器与算法体系。范围允许直接传递容器,哨兵支持不同类型结束标记,实现链式调用、惰性求值与零开销视图操作,简化代码并提升组合性。

    C++20中std::source_location与__FILE__/__LINE__区别
    C++20中std::source_location与__FILE__/__LINE__区别

    std::source_location是C++20引入的类型安全运行时类类型,自动捕获调用点的文件名、行号、列号和函数名,支持成员函数访问,常作带默认值的函数参数。

    C++20编译期常量初始化:consteval与constinit详解
    C++20编译期常量初始化:consteval与constinit详解

    consteval强制函数在编译期求值,如constevalintsquare(intn)只能接受编译期常量参数;constinit确保变量以常量初始化,如constinitstaticintx=42避免动态初始化,用于解决静态初始化顺序问题。两者分别强化了编译期计算和初始化控制,提升程序安全与可预测性。

    C++20三路比较运算符详解
    C++20三路比较运算符详解

    三路比较运算符(<=>)通过一次性完成小于、等于、大于的比较,简化了自定义类型的比较操作。1.它返回std::strong_ordering、std::weak_ordering或std::partial_ordering类型,分别表示强排序、弱排序和偏序;2.使用=default可让编译器自动生成比较逻辑,按成员变量声明顺序依次比较;3.编译器可根据operator<=>自动推导出其他比较运算符(如<、>、<=、>=、==、!=),减少代码重复;4.适用于

    C++20折叠表达式:告别递归实例化奇技
    C++20折叠表达式:告别递归实例化奇技

    C++20的折叠表达式通过迭代替代递归提升元编程效率。1.折叠表达式在编译期对参数包进行操作,语法为(packop...opinit)或(initop...oppack),避免传统模板元编程中的递归深度限制;2.示例包括计算参数包之和及类型大小总和,代码更简洁且降低编译负担;3.可用于复杂任务如编译期字符串连接与类型检查;4.实际应用涵盖静态多态、类型验证等领域,提高性能;5.使用时需注意参数包规模、运算符副作用及初始值选择等潜在问题。

    C++20 format库替代sprintf的用法
    C++20 format库替代sprintf的用法

    C++20的std::format库是一种类型安全、高效且现代的格式化解决方案。1.它通过编译时检查格式字符串和参数类型,避免了运行时类型不匹配错误;2.利用变参模板和编译时计算提升性能;3.提供丰富的格式化选项,如精度控制、对齐方式和千位分隔符;4.支持固定大小缓冲区格式化;5.相比sprintf更安全、更快且可读性更强;6.适用于C++20及以上版本,是传统格式化方法的首选替代方案。

    C++20 span容器如何安全访问连续内存
    C++20 span容器如何安全访问连续内存

    C++20的span容器是一种非拥有型内存视图,提供安全、高效访问连续内存的方法。它不管理数据生命周期,仅引用已有内存区域,适用于数组、vector和C风格数组。其优势包括:1.安全性:通过at()方法实现边界检查;2.灵活性:兼容多种内存结构;3.性能优越:无额外拷贝或分配;4.易用接口:提供类似容器的操作函数。使用时需注意避免生命周期错误,如不返回局部变量的span,合理使用subspan并确保范围正确。

    opencode安装skills教程及本地配置方法
    opencode安装skills教程及本地配置方法

    遇到OpenCode Skills无法加载或配置无效?本文手把手教你完成Skills的安装、环境变量设置及本地调试,避开常见坑点,让AI助手更懂你的代码习惯。

    如何开启Visual Studio2022实时代码分析警告提示
    如何开启Visual Studio2022实时代码分析警告提示

    解决 Visual Studio 2022 编辑时不显示代码分析警告的问题。指南涵盖 .NET 项目实时分析设置、Roslyn 分析器范围调整及错误列表来源筛选,确保开发者能高效利用实时代码诊断功能。

    如何在Visual Studio2022查看变量监视窗口调试程序
    如何在Visual Studio2022查看变量监视窗口调试程序

    详解 Visual Studio 2022 调试技巧:包括断点设置、监视窗口开启方法、变量添加步骤以及通过 F10 单步执行观察变量值变化的全过程。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。