std::source_location在C++20中用于自动捕获文件名、行号、函数名等源码信息,通过current()获取调用点位置,支持日志和断言中无需手动传入__FILE__、__LINE__,提升调试效率。

在C++20中,std::source_location 是一个轻量级的类,用于在编译时捕获源代码的上下文信息,比如文件名、行号、函数名等。它非常适合用在日志记录、断言、调试输出等场景,避免手动传入 __FILE__、__LINE__ 等宏。
std::source_location 提供了以下只读访问接口:
这个类型是隐式构造的,通常通过 std::source_location::current() 获取当前位置信息,且该调用不会产生运行时开销(在优化后基本被常量替代)。
你可以将 std::source_location 作为默认参数传入日志函数,自动捕获调用点信息:
立即学习“C++免费学习笔记(深入)”;
#include <iostream>
#include <string_view>
#include <source_location>
<p>void log(std::string_view message,
std::source_location loc = std::source_location::current())
{
std::cout << "[" << loc.file_name() << ":"
<< loc.line() << "] "
<< loc.function_name() << " - "
<< message << '\n';
}</p><p>void some_function() {
log("Something happened!");
// 输出: [main.cpp:xx] some_function - Something happened!
}</p>注意:由于 function_name() 返回的是编译器内部的函数签名(可能包含模板、重载信息并被 mangling 处理),实际显示可能不够友好。可结合工具如 c++filt 解析,或仅用于调试。
自定义断言宏可以利用 source_location 避免重复写文件和行号:
#include <iostream>
#include <source_location>
#include <cassert>
<p>void assertion_failed(const std::source_location& loc) {
std::cerr << "Assertion failed at "
<< loc.file_name() << ":" << loc.line()
<< " in " << loc.function_name() << "\n";
std::abort();
}</p><h1>define MY_ASSERT(expr) \</h1><pre class='brush:php;toolbar:false;'>do { \
if (!(expr)) { \
assertion_failed(std::source_location::current()); \
} \
} while(0)void test() { MY_ASSERT(2 + 2 == 5); // 输出: Assertion failed at test.cpp:xx in test }
这种方式比传统宏组合更简洁,也更容易维护。
function_name() 返回值可能很长且难读,不适合直接展示给终端用户source_location 是普通类型,但其内容依赖于调用点,若延迟使用仍反映原始位置基本上就这些。std::source_location 让日志和诊断信息变得更清晰、更自动化,是 C++20 中提升调试体验的小而美的特性。
以上就是C++的std::source_location如何使用_C++20中用于日志和断言的源码信息捕获的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号