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

source_location 是 C++20 引入的一个实用工具,定义在 <source_location></source_location> 头文件中。它允许程序在运行时或编译期获取当前代码的源码位置信息,比如文件名、行号、函数名等。这个功能特别适用于日志记录、调试断言、错误追踪等场景。
source_location 能获取哪些信息?
通过 std::source_location,你可以获取以下信息:
- 文件名(file_name)
- 行号(line)
- 列号(column)——某些编译器可能不支持精确列号
- 函数名(function_name)
这些信息是静态获取的,也就是说,在调用点自动填充,无需手动传参。
如何使用 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行号: 14
函数: some_function
消息: 发生了一个日志事件
在断言和错误处理中的应用
你可以用 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++在编译期获取源码位置信息用于日志和断言的详细内容,更多请关注其它相关文章!
# ai
# 医院网站推广方案策划书
# 什么饮料适合推广营销
# seo 网页
# 你可以
# 是在
# 发生了
# 是一个
# 的是
# 更清晰
# 化与
# 尼克
# 套件
# 行号
# stream
# ios
# c++
# 工具
# 自制黑胶网站推广方案
# 大连seo招聘信息优化
# 烟台seo代运营
# 苏州seo推广优化收费
# seo灰色面试
# 十月营销推广方案ppt模板分享
# 安康绍兴网站建设
相关栏目:
【
企业资讯168 】
【
行业动态20933 】
【
网络营销52431 】
【
网络学院91036 】
【
运营推广7012 】
【
科技资讯60970 】
相关推荐:
58动漫网在线官方网 58动漫网正版动漫入口网址
mysql备份恢复性能优化_mysql备份恢复性能优化方法
漫蛙Manwa2官网入口地址分享 漫蛙漫画PC版永久访问通道
小米汽车11月交付量突破40000台!雷军:将继续努力
优化MinIO list_objects_v2 操作的性能瓶颈与最佳实践
12306选座怎么选到特殊座位_12306特殊座位选择注意事项
拷贝漫画电脑版官网入口 拷贝漫画(PC版)在线直达
Win11输入法不见了怎么办_Windows11恢复语言栏显示方法
优化Log4j2控制台输出性能:解决异步日志瓶颈
Pandas DataFrame 多条件优先级排序与排名
mc.js免安装版 mc.js一键畅玩入口
铁路12306的积分有效期是多久_铁路12306积分有效期说明
qq游戏大厅官方下载_qq游戏免费下载安装入口
深入理解Promise链:如何在catch后中断then的执行
AngularJS $http POST请求数据传递与Go后端接收实践
ArrayList与LinkedList操作复杂度详解:遍历与修改
J*aScript数据结构转换:将对象数组按类别分组
LocoySpider如何部署到云服务器_LocoySpider云部署的远程配置
在Runstone环境中高效处理TasteDive API的JSON数据
c++ 获取系统当前时间 c++时间戳获取方法
Win10自动更新怎么关闭 Win10永久关闭系统更新的两种方法【终极版】
Python自定义类排序:解决lambda键值访问TypeError的实践指南
qq音乐在线播放入口_qq音乐电脑版登录链接
J*aScript中向JSON对象添加新属性的正确姿势
字由网在线版登录地址 字由网网页版安全入口
126邮箱网页版官方入口 126邮箱账号在线登录平台
DLsite中文平台入口 DLsite官网内容在线查看
Python vgamepad库按键模拟:正确使用XUSB_BUTTON常量
J*a里如何实现线程安全的懒加载单例_懒加载单例实现方法解析
J*a中为什么不建议滥用继承_继承滥用带来的耦合与脆弱性问题
c++如何使用TBB库进行任务并行_c++ Intel线程构建模块
ArchiveofOurOwn小说阅读-ArchiveofOurOwn同人作品访问链接
解决深度学习模型训练初期异常高损失与完美验证准确率问题
蛙漫漫画官网在线入口 蛙漫全本漫画免费阅读平台
极速漫画官方主页网址 极速漫画漫画在线浏览官网链接
GemBox Document HTML转PDF垂直文本渲染问题及解决方案
解决Django多数据库/多Schema环境下外键迁移问题
C++如何进行游戏物理模拟_使用Box2D库为C++游戏添加2D物理效果
html两个JS只运行一个怎么办_让双JS在html中都运行方法【技巧】
Win11 BitLocker密码忘了怎么办 Win11找回BitLocker恢复密钥方法【解决】
c++如何使用std::memory_order控制原子操作顺序_c++ C++11内存模型详解
虚幻5科幻题材ARPG大作遭取消!本是《奇异人生》厂商新作
Python中如何避免重复条件判断:利用数据结构实现动态逻辑
C++ typeid如何获取类型信息_C++ RTTI运行时类型识别用法
手机CPU怎么影响游戏体验_手机CPU对游戏性能的影响分析
百度网盘网页版入口 百度网盘网页版官方登录网址
Discord Slash 命令响应超时问题的异步解决方案
谷歌浏览器无痕模式怎么开 Chrome开启无痕浏览设置方法【教程】
抓大鹅解压小游戏 抓大鹅摸鱼解压入口
VS Code远程开发时如何处理文件权限问题


