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

在C++20中,std::source_location 提供了一种轻量且标准的方式,在运行时获取代码的源文件名、行号、函数名等调试信息。相比传统的宏如 __FILE__ 和 __LINE__,它更灵活,且能自动捕获调用位置。
如何使用 std::source_location 获取文件名和行号
std::source_location 是一个类,定义在头文件 current())在调用点自动捕获位置信息。
基本用法如下:
#include <iostream>
#include <source_location>
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;
}
输出结果类似:
文件: main.cpp行号: 12
函数: main
支持的源位置信息字段
std::source_location 提供了多个成员函数来访问不同维度的源码信息:
- file_name():返回源文件的路径或文件名(编译器决定是否包含完整路径)
- line():返回当前行号(从1开始)
- column():返回列号(部分编译器可能不支持,通常为0)
- function_name():返回所在函数的名称(通常是经过修饰的名称)
注意:function_name() 返回的是编译器内部表示的函数名,可能包含命名空间和参数类型(即“name mangling”),可读性较差。若需清晰名称,建议手动传入或结合其他调试工具。
在日志和断言中的实用场景
将 std::sour
ce_location 集成到日志系统或断言机制中,可以显著提升调试效率。
千鹿Pr助手
智能Pr插件,融入众多AI功能和海量素材
128
查看详情
例如,实现一个带位置信息的调试宏:
#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() 是隐式生成的,不能跨线程传递后再期望反映原始位置——它只在被调用时捕获当前上下文。
以上就是c++++怎么使用std::source_location获取文件名和行号_C++调试信息获取与源位置追踪的详细内容,更多请关注其它相关文章!
# 多个
# 文学网站建设工作内容
# 渭南网站建设套餐
# 网站建设p
# 郑州b2b平台整合营销推广
# 昌乐公司网站建设推广
# 河北京东网站推广一体化
# 网站建设开发价格多少
# 椒江seo排名如何调整
# seo排名出租
# 阳江网站霸屏推广
# 中文网
# 相关文章
# c++
# 是一个
# 的是
# 文本文件
# 如何用
# 多线程
# 如何实现
# 行号
# stream
# ios
# ai
# 工具
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
win11开机启动修复循环怎么办 Win11无法进入系统高级启动解决方法【修复】
提升Kafka消费者健壮性:会话超时处理与消息处理语义
手机CPU怎么影响游戏体验_手机CPU对游戏性能的影响分析
HTML转PPT成品工具有哪些?HTML网页转PPT成品工具大全
Win11 BitLocker密码忘了怎么办 Win11找回BitLocker恢复密钥方法【解决】
win11 Snap Layouts怎么用 Win11窗口布局与分屏多任务高效指南【必学】
漫蛙2(台版)官方入口地址 漫蛙2(台版)正版漫画网页端
快手赚钱渠道_快手收益来源
Golang如何使用net/url解析URL_Golang URL解析与处理方法
在命令行怎么运行html项目_命令行运行html项目方法【教程】
支付宝碰一碰设备是REDMI手机吗 博主拆机辟谣:处理器、内存都不一样
uc浏览器网页版极速入口 uc网页浏览器网页版流畅体验
Tailwind CSS line-clamp 布局问题解析与修复指南
谷歌google账号怎么注册账号 谷歌账号注册官方流程
AO3网页版合集入口 Archive of Our Own同人作品浏览指南
解决Django多数据库/多Schema环境下外键迁移问题
Fabric Mod开发:在1.19.3+版本中正确添加自定义物品并管理物品组
C++ typeid如何获取类型信息_C++ RTTI运行时类型识别用法
Composer如何解决json扩展缺失的错误
生成rdflib自定义SPARQL函数:参数匹配与实践指南
Python getattr() 异常处理深度解析:避免程序意外退出
拼多多赚钱渠道_拼多多收益来源
如何在网页中实现特定地点的随机图片展示
Linux如何排查内存不足OOME问题_LinuxOOM分析教程
如何在J*a中实现统一对象行为接口_项目大型化时的接口规范化
Excel函数批量查找替换超快方法_Excel用REPLACE和FIND函数秒级替换
怎样把文件彻底粉碎无法恢复_Windows下安全删除敏感数据【隐私保护】
J*aScript动态修改指定div内所有a标签样式指南
火狐浏览器占用内存高卡顿怎么办 火狐浏览器性能优化设置技巧
mc.js官网登录入口 mc.js官方登录入口最新版
Django表单验证失败时保留用户输入数据的最佳实践
Composer的 "licenses" 命令如何帮助你遵守开源协议_检查项目依赖的许可证合规性
苹果手机如何防止被恶意App追踪
lar*el怎么安全地存储和获取配置文件中的敏感信息_lar*el敏感信息安全存储方法
漫蛙Manwa2官网入口地址分享 漫蛙漫画PC版永久访问通道
Python实时数据流中的动态最值查找策略
深入理解rpy2中的类型转换:优化Python对象到R矩阵的映射
Python vgamepad库按键模拟:正确使用XUSB_BUTTON常量
HTML元素状态管理:根据DIV内容动态启用/禁用按钮
wps文字怎么插入目录并自动更新_wps文字如何插入目录并自动更新方法
Python类型检查:优化关联可选属性的Mypy推断策略
免费抖音短视频入口_抖音网页版短视频免费通道
c++ 获取系统当前时间 c++时间戳获取方法
《噬血代码2》新预告片发布 展示游戏剧情
如何使用CaptainHook和Composer管理Git钩子_在提交前自动运行代码检查的Composer配置
一加手机拍照效果不好怎么办 一加哈苏影像调校与专业模式使用教程【高手篇】
AngularJS $http POST请求数据传递与Go后端接收实践
jQuery Mask 插件中实现电话号码固定前导零的教程
Win11怎么查看显卡显存 Win11显示适配器属性及专用视频内存查询
微信聊天记录怎么加密_微信聊天记录加密方法


2025-11-10
浏览次数:次
返回列表