推荐答案
// www.javascriptcn.com code example
#include <iostream>
#include <source_location>
void log(const std::string& message, const std::source_location& location = std::source_location::current()) {
std::cout << "File: " << location.file_name() << "(" << location.line() << ":" << location.column() << ") "
<< "Function: " << location.function_name() << " - " << message << std::endl;
}
int main() {
log("This is a log message.");
return 0;
}本题详细解读
1. std::source_location 简介
std::source_location 是 C++20 引入的一个新特性,用于在代码中获取当前源代码的位置信息。它可以帮助开发者在调试或日志记录时,轻松获取文件名、行号、列号以及函数名等信息。
2. 主要成员函数
file_name(): 返回当前源代码文件的名称。line(): 返回当前代码所在的行号。column(): 返回当前代码所在的列号。function_name(): 返回当前函数的名称。current(): 静态成员函数,返回当前调用点的std::source_location对象。
3. 使用场景
std::source_location 主要用于调试和日志记录。通过在日志函数中传递 std::source_location 对象,可以自动记录日志消息的来源位置,而不需要手动输入文件名和行号等信息。
4. 示例代码解析
在示例代码中,log 函数接受一个字符串消息和一个 std::source_location 对象。std::source_location::current() 用于获取调用 log 函数时的源代码位置信息。然后,这些信息与日志消息一起输出到控制台。
5. 注意事项
std::source_location是轻量级的,通常通过值传递。- 由于
std::source_location是 C++20 的新特性,确保编译器支持 C++20 标准。 - 在某些情况下,
function_name()可能返回编译器特定的名称修饰(mangled name),而不是人类可读的函数名。