std::source_location 可获取文件名、行号、列号和函数名。通过默认参数自动捕获调用位置,常用于日志、断言等场景,信息在编译期确定,性能开销极小,取代传统宏实现,代码更安全简洁。

source_location 是 C++20 引入的一个实用工具,定义在 <source_location></source_location> 头文件中。它允许程序在运行时或编译期获取当前代码的源码位置信息,比如文件名、行号、函数名等。这个功能特别适用于日志记录、调试断言、错误追踪等场景。
通过 std::source_location,你可以获取以下信息:
这些信息是静态获取的,也就是说,在调用点自动填充,无需手动传参。
最常见的用法是将其作为函数参数的默认值,利用编译器自动推导当前位置:
#include <iostream>
#include <source_location>
#include <string_view>
void log(std::string_view message,
std::source_location loc = std::source_location::current())
{
std::cout << "文件: " << loc.file_name() << "\n"
<< "行号: " << loc.line() << "\n"
<< "函数: " << loc.function_name() << "\n"
<< "消息: " << message << "\n\n";
}
void some_function() {
log("发生了一个日志事件");
}
输出类似:
文件: main.cpp你可以用 source_location 增强自定义断言,让错误信息更清晰:
风车Ai翻译
跨境电商必备AI翻译工具
360
查看详情
#define ASSERT(expr) \
do { \
if (!(expr)) { \
std::cerr << "断言失败: " #expr "\n" \
<< "文件: " << std::source_location::current().file_name() << "\n" \
<< "行号: " << std::source_location::current().line() << "\n" \
<< "函数: " << std::source_location::current().function_name() << "\n"; \
std::terminate(); \
} \
} while(0)
这样当断言触发时,能立刻定位到出错位置,极大提升调试效率。
std::source_location::current() 是一个特殊的函数,虽然看起来像普通函数调用,但它返回的是编译期常量。这意味着位置信息是在编译时确定的,性能开销极小,几乎可以忽略。
注意:尽管信息是编译期生成,但对象本身通常在运行时构造,不过现代编译器会高度优化这类操作。
基本上就这些。C++20 的 source_location 提供了一种类型安全、零成本的方式来获取源码位置,取代了过去依赖宏如 __FILE__ 和 __LINE__ 的方式,写法更简洁,语义更清晰。
以上就是C++20的source_location是什么_C++在编译期获取源码位置信息用于日志和断言的详细内容,更多请关注其它相关文章!
# 发生了
# 安康绍兴网站建设
# 十月营销推广方案ppt模板分享
# seo灰色面试
# 苏州seo推广优化收费
# 烟台seo代运营
# 大连seo招聘信息优化
# 自制黑胶网站推广方案
# 医院网站推广方案策划书
# 什么饮料适合推广营销
# seo 网页
# 你可以
# 是在
# 工具
# 是一个
# 的是
# 更清晰
# 化与
# 尼克
# 套件
# 行号
# stream
# ios
# c++
# ai
相关文章:
俄罗斯Yandex免登录入口_Yandex搜索引擎官网一键直达
Golang如何安装Swagger工具_GoSwagger文档生成环境
WooCommerce 购物车显示所有交叉销售商品教程
J*aScript Promise链中如何正确终止后续.then执行并处理错误
Promise错误处理:在catch后终止链式then执行的策略
在Pyomo中实现基于变量的条件约束:Big-M方法详解
sublime怎么设置启动时打开的窗口_sublime会话管理与热退出
不会效仿卡普空!《铁拳》制作人澄清:不采取赛事付费|直播|
在命令行怎么运行html项目_命令行运行html项目方法【教程】
J*a中实现Go语言select通道多路复用机制
Lar*el递归关系中排除子孙节点的策略
QQ邮箱官方网页版登录 QQ邮箱个人邮箱快速访问
Go与Ruby之间实现AES加密互通:CFB模式下的密钥长度匹配策略
b站怎么看视频的弹幕数量_b站弹幕数量查看方法
AngularJS $http POST请求数据传递与Go后端接收实践
React Hooks最佳实践:动态组件状态管理的组件化方案
CSS条件样式无法按设备触发怎么排查_media条件语句正确设置解决触发问题
cad如何更改注释性对象的比例_cad注释性比例调整方法
汽水音乐车机版8.9下载 汽水音乐车机版8.9版本安装入口
c++ dfs和bfs代码 c++深度广度优先搜索算法
Lar*el的路由模型绑定怎么用_Lar*el Route Model Binding简化控制器逻辑
支付宝解绑银行卡步骤_支付宝如何解除绑定银行卡
百度浏览器字体显示异常偏小_百度浏览器字体渲染修复方案
AO3网页版合集入口 Archive of Our Own同人作品浏览指南
铁路12306官网网页端快速入口 铁路12306官方首页登录教程
win11如何加载ICC颜色配置文件 Win11校色文件安装与显示器色彩管理【指南】
C#如何安全地从用户上传的XML文件中读取数据? 验证与清理策略
Log4j Console Appender性能瓶颈与高并发优化策略
使用 Pandas 高效处理 .dat 文件:数据清洗与数值计算实战
Win11怎么查看电脑配置_Win11硬件配置检测工具使用
Golang如何通过reflect获取匿名字段方法_Golang reflect匿名字段方法访问技巧
在J*a中如何使用Stream.map转换元素_Stream映射操作解析
可靠CSGO开箱平台解析 CSGO开箱网合集
抖音从哪里进入网页版_抖音官方入口链接
ACG动漫视频网入口 ACG动漫*免费正版观看地址
使用 Pandas 高效处理 .dat 文件:字符清理与数据计算
漫蛙MANWA漫画主页官方入口 漫蛙漫画最新在线阅读地址
iCloud登录入口网页版 苹果iCloud官网登录
在React函数组件中利用原生HTML5进行邮箱地址验证
J*a 递归快速排序中静态变量的状态管理与陷阱
必由学官方平台入口 必由学在线课堂登录地址
Yandex搜索引擎官方地址 俄罗斯网络世界的主要入口
高德地图怎么看全景照片_高德地图全景照片浏览教程
Sublime Text怎么设置垂直标尺_Sublime配置Rulers规范代码长度
火锅吃太多会怎样 火锅吃太多会上火吗
小米14应用无法联网原因分析_小米14网络权限修复
在哪找SublimeJ远程工具_SFTP插件配置教程
中兴Axon42Ultra怎样在文件App筛图_iPhone中兴Axon42Ultra文件App筛图【图片筛选】
京东京造J1和网易云音乐氧气真无线有什么不同_国产电商蓝牙耳机音质对比
构建轻量级网站内部消息系统:Formspree 集成指南
*请认真填写需求信息,我们会在24小时内与您取得联系。