0

0

c++怎么使用std::source_location获取文件名和行号_C++调试信息获取与源位置追踪

穿越時空

穿越時空

发布时间:2025-11-10 21:07:02

|

996人浏览过

|

来源于php中文网

原创

c++kquote>答案:std::source_location 是 C++20 提供的用于获取源码位置信息的类,通过 current() 静态方法在调用点自动捕获文件名、行号和函数名,常用于日志和断言中提升调试效率。

c++怎么使用std::source_location获取文件名和行号_c++调试信息获取与源位置追踪

在C++20中,std::source_location 提供了一种轻量且标准的方式,在运行时获取代码的源文件名、行号、函数名等调试信息。相比传统的宏如 __FILE____LINE__,它更灵活,且能自动捕获调用位置。

如何使用 std::source_location 获取文件名和行号

std::source_location 是一个类,定义在头文件 中。它通过静态成员函数(如 current())在调用点自动捕获位置信息。

基本用法如下:

#include 
#include 

void log(const std::source_location& loc = std::source_location::current())
{
    std::cout << "文件: " << loc.file_name() << "\n";
    std::cout << "行号: " << loc.line() << "\n";
    std::cout << "函数: " << loc.function_name() << "\n";
}

int main()
{
    log(); // 自动输出当前调用位置
    return 0;
}

输出结果类似:

立即学习C++免费学习笔记(深入)”;

文件: main.cpp
行号: 12
函数: main

支持的源位置信息字段

std::source_location 提供了多个成员函数来访问不同维度的源码信息:

  • file_name():返回源文件的路径或文件名(编译器决定是否包含完整路径)
  • line():返回当前行号(从1开始)
  • column():返回列号(部分编译器可能不支持,通常为0)
  • function_name():返回所在函数的名称(通常是经过修饰的名称)

注意:function_name() 返回的是编译器内部表示的函数名,可能包含命名空间和参数类型(即“name mangling”),可读性较差。若需清晰名称,建议手动传入或结合其他调试工具

Dreamhouse AI
Dreamhouse AI

AI室内设计,快速重新设计你的家,虚拟布置家具

下载

在日志和断言中的实用场景

std::source_location 集成到日志系统或断言机制中,可以显著提升调试效率。

例如,实现一个带位置信息的调试宏:

#define DEBUG_LOG() \
    log(std::source_location::current())

// 使用
DEBUG_LOG(); // 自动打印调用处的文件、行号

或者用于自定义断言:

void assertion_failed(const std::source_location& loc)
{
    std::cerr << "断言失败!\n"
              << "位置: " << loc.file_name() 
              << ":" << loc.line() << "\n";
}

#define MY_ASSERT(cond) \
    do { if (!(cond)) assertion_failed(std::source_location::current()); } while(0)

注意事项与兼容性

std::source_location 是 C++20 特性,需确保编译器支持:

  • GCC 11+(启用 -std=c++20)
  • Clang 12+(-std=c++20)
  • MSVC 19.29+(Visual Studio 2019 16.10)

如果项目暂未升级到 C++20,可考虑使用第三方库(如 Boost.Stacktrace)或封装传统宏 __FILE____LINE__ 模拟类似功能。

另外,由于 std::source_location::current() 是隐式生成的,不能跨线程传递后再期望反映原始位置——它只在被调用时捕获当前上下文。

基本上就这些。std::source_location 简洁高效,是现代C++中追踪源码位置的理想选择。

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

466

2023.08.10

Golang 命令行工具(CLI)开发实战
Golang 命令行工具(CLI)开发实战

本专题系统讲解 Golang 在命令行工具(CLI)开发中的实战应用,内容涵盖参数解析、子命令设计、配置文件读取、日志输出、错误处理、跨平台编译以及常用CLI库(如 Cobra、Viper)的使用方法。通过完整案例,帮助学习者掌握 使用 Go 构建专业级命令行工具与开发辅助程序的能力。

1

2025.12.29

ip地址修改教程大全
ip地址修改教程大全

本专题整合了ip地址修改教程大全,阅读下面的文章自行寻找合适的解决教程。

162

2025.12.26

压缩文件加密教程汇总
压缩文件加密教程汇总

本专题整合了压缩文件加密教程,阅读专题下面的文章了解更多详细教程。

52

2025.12.26

wifi无ip分配
wifi无ip分配

本专题整合了wifi无ip分配相关教程,阅读专题下面的文章了解更多详细教程。

108

2025.12.26

漫蛙漫画入口网址
漫蛙漫画入口网址

本专题整合了漫蛙入口网址大全,阅读下面的文章领取更多入口。

349

2025.12.26

b站看视频入口合集
b站看视频入口合集

本专题整合了b站哔哩哔哩相关入口合集,阅读下面的文章查看更多入口。

673

2025.12.26

俄罗斯搜索引擎yandex入口汇总
俄罗斯搜索引擎yandex入口汇总

本专题整合了俄罗斯搜索引擎yandex相关入口合集,阅读下面的文章查看更多入口。

795

2025.12.26

虚拟号码教程汇总
虚拟号码教程汇总

本专题整合了虚拟号码接收验证码相关教程,阅读下面的文章了解更多详细操作。

64

2025.12.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 5.5万人学习

C 教程
C 教程

共75课时 | 3.7万人学习

C++教程
C++教程

共115课时 | 10.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号