需通过 std::source_location::current() 作为默认参数在日志函数中显式捕获。
std::source_location 是 C++20 引入的轻量结构体,用于在编译期捕获调用点的源码位置信息。它不依赖运行时堆栈遍历,也不触发函数内联抑制(只要编译器支持 C++20 且未禁用),因此开销极低。关键在于:它不是“获取当前行号”,而是“让调用者把它的位置传进来”——这决定了你必须在日志宏里用 __LINE__ 或更规范的 std::source_location::current() 显式捕获。
直接把 std::source_location 当作函数参数传入即可,但注意默认值必须是编译期可求值的表达式。最常用写法是用静态成员函数 std::source_location::current() 作为默认实参:
void log_debug(const char* msg, const std::source_location loc = std::source_location::current()) {
std::cout << "[" << loc.file_name() << ":" << loc.line() << "] " << msg << "\n";
}调用时无需手动传参:log_debug("value is 42"); 就会自动记录调用点的文件名与行号。若手动传入(比如封装中间层),需确保调用点仍是最终用户代码位置,否则行号会偏移。
std::source_location::current() —— 那会记录包装函数自身的行号loc.function_name() 在 GCC/Clang 中通常返回空字符串;MSVC 支持较好,但不可依赖纯函数调用无法解决“用户调用点 vs 包装函数”的行号偏移问题,必须用宏。宏展开发生在预处理阶段,std::source_location::current() 在宏体内求值,就落在用户代码行上:
#define LOG_DEBUG(msg) \
log_debug(msg, std::source_location::current())这样 LOG_DEBUG("x = " + std::to_string(x)); 记录的就是这行本身的行号。更进一步,可支持格式化:
#define LOG_INFO(fmt, ...) \
do { \
std::ostringstream _oss; \
_oss << fmt; \
log_info(_oss.str().c_str(), std::source_location::current()); \
} while(0)注意:__VA_ARGS__ 展开后不能直接传给 std::source_location::current(),因为逗号会破坏宏参数解析;必须先拼接好字符串再传。
do { ... } while(0) 包裹可防止 if-else 分支中出现语法错误-std=c++20 后才支持 std::source_location;MSVC 需 VS 2019 16.8+典型现象包括:所有日志都显示同一行号(比如总显示在 log.h 第 42 行),或编译报错 error: 'std::source_location::current' is not a constant expression。
-std=c++20 或项目设置未启用 C++20 —— 这是最常见的原因std::source_location::current() —— 它不是 constexpr 函数,不能用于常量表达式std::source_location::current() 写在函数体内部而非默认参数位置,又没用宏 —— 行号永远是该函数定义处的行验证是否生效,可在不同文件、不同行各调用一次 LOG_DEBUG("test"),观察输出的 loc.line() 是否随调用位置变化。不变化,说明捕获点没落在用户代码上。
# 栈
# c++
# 为什么
# 常量
# if
# while
# 封装
# 成员函数
# Error
# 字符串
# 结构体
# 堆
# 实参
# 行号
# 落在
# 它不
# 极低
# 体内
# 这是
# 就会
# 也不
# 中间层
# 求值
相关文章:
购物网站制作公司有哪些,哪个购物网站比较好?
建站之星安装需要哪些步骤及注意事项?
浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?
如何挑选高效建站主机与优质域名?
道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?
建站之星安装步骤有哪些常见问题?
建站OpenVZ教程与优化策略:配置指南与性能提升
Swift中循环语句中的转移语句 break 和 continue
如何高效完成自助建站业务培训?
网站制作免费,什么网站能看正片电影?
合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?
企业微网站怎么做,公司网站和公众号有什么区别?
如何通过虚拟主机空间快速建站?
股票网站制作软件,网上股票怎么开户?
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
学校建站服务器如何选型才能满足性能需求?
如何在宝塔面板中修改默认建站目录?
,在苏州找工作,上哪个网站比较好?
Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解
建站之星后台密码如何安全设置与找回?
金*站制作公司有哪些,金华教育集团官网?
如何快速配置高效服务器建站软件?
如何用好域名打造高点击率的自主建站?
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
如何在阿里云服务器自主搭建网站?
南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?
如何实现建站之星域名转发设置?
建站之星图片链接生成指南:自助建站与智能设计教程
如何访问已购建站主机并解决登录问题?
如何用花生壳三步快速搭建专属网站?
如何制作网站标识牌,动态网站如何制作(教程)?
公司网站设计制作厂家,怎么创建自己的一个网站?
Android自定义控件实现温度旋转按钮效果
香港服务器网站卡顿?如何解决网络延迟与负载问题?
东莞专业制作网站的公司,东莞大学生网的网址是什么?
魔方云NAT建站如何实现端口转发?
如何快速选择适合个人网站的云服务器配置?
招商网站制作流程,网站招商广告语?
焦点电影公司作品,电影焦点结局是什么?
如何选择美橙互联多站合一建站方案?
家具网站制作软件,家具厂怎么跑业务?
建站之星如何开启自定义404页面避免用户流失?
建站主机系统SEO优化与智能配置核心关键词操作指南
如何有效防御Web建站篡改攻击?
建站之星2.7模板快速切换与批量管理功能操作指南
实惠建站价格推荐:2025年高性价比自助建站套餐解析
如何基于PHP生成高效IDC网络公司建站源码?
php条件判断怎么写_ifelse和switchcase的使用区别【对比】
实现点击下箭头变上箭头来回切换的两种方法【推荐】
如何将凡科建站内容保存为本地文件?
*请认真填写需求信息,我们会在24小时内与您取得联系。