全网整合营销服务商

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

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

c++中的std::source_location和__FILE__/__LINE__有什么区别_c++现代日志与调试【C++20】

std::source_location 是 C++20 引入的类型安全运行时类类型,自动捕获调用点的文件名、行号、列号和函数名,支持成员函数访问,常作带默认值的函数参数。

std::source_location 是类型安全的运行时对象

std::source_location 是 C++20 引入的标准库类型,它在调用点(通常是函数入口)自动构造一个包含文件名、行号、列号和函数名的结构化对象。它不是宏,而是一个可传递、可拷贝、可存储的类类型,支持成员函数如 file_name()line()column()function_name()

典型用法是作为函数默认参数:

void log(const std::string& msg, 
         const std::source_location& loc = std::source_location::current()) {
    std::cerr << "[" << loc.file_name() << ":" << loc.line() 
              << "] " << msg << "\n";
}

调用 log("error occurred") 时,编译器自动填入**实际调用处**的位置信息,而非定义处 —— 这对封装日志函数至关重要。

__FILE__/__LINE__ 是预处理宏,无类型、无作用域控制

__FILE____LINE__ 是传统 C 风格的预处理器宏,在预处理阶段被文本替换为字面量字符串和整数。它们不经过类型检查,不能直接参与模板推导或作为类成员;且一旦写在某个函数/宏定义里,展开后固定指向该定义位置,无法反映调用点。

例如:

#define LOG(msg) std::cerr << __FILE__ << ":" << __LINE__ << " " << msg << "\n"
void foo() { LOG("in foo"); } // 输出的是 LOG 宏定义所在行,不是 foo() 中这行

除非手动传参(如 LOG("msg", __FILE__, __LINE__)),否则容易误标位置 —— 尤其在封装层中极易出错。

关键差异总结

  • 时机不同:source_location 在运行时构造(但开销极小,通常内联为常量),__FILE__/__LINE__ 在预处理阶段硬编码
  • 位置归属不同:source_location 默认捕获调用点,宏展开后常捕获定义点(除非显式传递)
  • 表达能力不同:source_location 提供函数名、列号等额外信息,且支持自定义格式化;宏仅提供原始字符串和数字
  • 安全性不同:source_location 是 const 对象,不可篡改;宏是裸字面量,易被意外修改或拼接出错(如路径含空格或特殊字符)

现代日志实践中推荐组合使用

不必非此即彼。常见稳健做法是:

  • 对外日志接口统一用 std::source_location 作默认参数,保证调用溯源准确
  • 底层输出时,若需兼容旧系统或做特殊处理(如裁剪长路径),再用 loc.file_name() 获取字符串进一步加工
  • 调试断言中仍可用 assert(condition && "msg") + __FILE__/__LINE__(因 assert 属于预处理行为),但生产级日志建议迁移到 source_location

基本上就这些 —— 不复杂但容易忽略细节。C++20 的 source_location 让“在哪出的问题”这件事,终于有了标准、干净、靠谱的答案。


# c++  # 区别  # 标准库  # 常量  # 封装  # 成员函数  # Error  # const  # 字符串  # 预处理器  # 无类型  # 接口  # 对象  # 作用域  # column  # 行号  # 的是  # 非此即彼  # 这件事  # 这对  # 自定义  # 再用  # 它在  # 而非  # 写在 


相关文章: 如何设置并定期更换建站之星安全管理员密码?  如何快速上传建站程序避免常见错误?  制作网站的公司有哪些,做一个公司网站要多少钱?  北京专业网站制作设计师招聘,北京白云观官方网站?  html制作网站的步骤有哪些,iapp如何添加网页?  香港服务器WordPress建站指南:SEO优化与高效部署策略  如何在阿里云虚拟服务器快速搭建网站?  如何快速完成中国万网建站详细流程?  SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  建站主机无法访问?如何排查域名与服务器问题  如何选择高效可靠的多用户建站源码资源?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  网站专业制作公司有哪些,做一个公司网站要多少钱?  如何通过免费商城建站系统源码自定义网站主题与功能?  如何在橙子建站中快速调整背景颜色?  建站主机CVM配置优化、SEO策略与性能提升指南  如何登录建站主机?访问步骤全解析  免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?  建站之星后台密码遗忘?如何快速找回?  建站之星如何助力网站排名飙升?揭秘高效技巧  网站制作知乎推荐,想做自己的网站用什么工具比较好?  如何用wdcp快速搭建高效网站?  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  如何做网站制作流程,*游戏网站怎么搭建?  实例解析angularjs的filter过滤器  企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?  建站之星伪静态规则如何正确配置?  建站之星官网登录失败?如何快速解决?  网站建设制作、微信公众号,公明人民医院怎么在网上预约?  建站上传速度慢?如何优化加速网站加载效率?  C++中引用和指针有什么区别?(代码说明)  外汇网站制作流程,如何在工商银行网站上做外汇买卖?  Swift开发中switch语句值绑定模式  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  ,有什么在线背英语单词效率比较高的网站?  建站主机如何安装配置?新手必看操作指南  如何零成本快速生成个人自助网站?  ,石家庄四十八中学官网?  专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?  制作门户网站的参考文献在哪,小说网站怎么建立?  建站主机默认首页配置指南:核心功能与访问路径优化  如何打造高效商业网站?建站目的决定转化率  ,购物网站怎么盈利呢?  建站主机服务器选型指南与性能优化方案解析  南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?  如何在Windows虚拟主机上快速搭建网站?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  建站之星导航菜单设置与功能模块配置全攻略 

您的项目需求

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