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

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

c++中的std::source_location和__FILE__/__LINE__有什么区别_c++现代日志与调试【C++20】-第1张图片-佛山资讯网

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

立即学习“C++免费学习笔记(深入)”;

标签: c++20 日志调试 c++ 区别 标准库

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~