全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C++20的source_location是什么_C++在编译期获取源码位置信息用于日志和断言

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

source_location 是 C++20 引入的一个实用工具,定义在 头文件中。它允许程序在运行时或编译期获取当前代码的源码位置信息,比如文件名、行号、函数名等。这个功能特别适用于日志记录、调试断言、错误追踪等场景。

source_location 能获取哪些信息?

通过 std::source_location,你可以获取以下信息:

  • 文件名(file_name)
  • 行号(line)
  • 列号(column)——某些编译器可能不支持精确列号
  • 函数名(function_name)

这些信息是静态获取的,也就是说,在调用点自动填充,无需手动传参。

如何使用 source_location?

最常见的用法是将其作为函数参数的默认值,利用编译器自动推导当前位置:

#include 
#include 
#include 

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 增强自定义断言,让错误信息更清晰:

#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__ 的方式,写法更简洁,语义更清晰。


# 工具  # ai  # c++  # ios  # stream  # 常量  # 对象  # 事件  # column  # 行号  # 更清晰  # 的是  # 是一个  # 发生了  # 是在  # 你可以  # 可以用  # 适用于  # 将其 


相关文章: 官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站  如何通过万网虚拟主机快速搭建网站?  建站主机无法访问?如何排查域名与服务器问题  制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?  深圳网站制作的公司有哪些,dido官方网站?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  建站之星多图banner生成与模板自定义指南  C#怎么使用委托和事件 C# delegate与event编程方法  如何在万网自助建站平台快速创建网站?  专业公司网站制作公司,用什么语言做企业网站比较好?  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  音响网站制作视频教程,隆霸音响官方网站?  小型网站建站如何选择虚拟主机?  动图在线制作网站有哪些,滑动动图图集怎么做?  如何快速搭建响应式可视化网站?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  制作国外网站的软件,国外有哪些比较优质的网站推荐?  建站之星如何助力网站排名飙升?揭秘高效技巧  网站制作大概多少钱一个,做一个平台网站大概多少钱?  开封网站制作公司,网络用语开封是什么意思?  常州自助建站:操作简便模板丰富,企业个人快速搭建网站  红河网站制作公司,红河事业单位身份证如何上传?  在线制作视频的网站有哪些,电脑如何制作视频短片?  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  昆明网站制作哪家好,昆明公租房申请网上登录入口?  建站主机是什么?如何选择适合的建站主机?  如何彻底删除建站之星生成的Banner?  湖北网站制作公司有哪些,湖北清能集团官网?  如何快速生成凡客建站的专业级图册?  建站之星伪静态规则如何设置?  网站制作公司排行榜,四大门户网站排名?  公众号网站制作网页,微信公众号怎么制作?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?  如何高效完成独享虚拟主机建站?  如何用西部建站助手快速创建专业网站?  建站主机CVM配置优化、SEO策略与性能提升指南  中山网站制作网页,中山新生登记系统登记流程?  专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  建站主机是否等同于虚拟主机?  如何在阿里云完成域名注册与建站?  网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?  网站建设制作、微信公众号,公明人民医院怎么在网上预约?  视频网站制作教程,怎么样制作优酷网的小视频?  大连网站设计制作招聘信息,大连投诉网站有哪些?  建站之星客服服务时间及联系方式如何?  如何快速使用云服务器搭建个人网站?  建站主机数据库如何配置才能提升网站性能?  C++如何编写函数模板?(泛型编程入门) 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。