最常用写法是定义宏log_line()调用std::source_location::current(),日志函数按值接收默认参数;不可取地址或绑定引用,因返回纯右值;跨平台需校验line()==1且file_name()为空时回退。
std::source_location 本身不支持直接打印,必须显式调用 line()、file_name() 等成员函数才能拿到行号等信息;它只是个轻量值类型,不是格式化工具。
怎么在日志里自动捕获当前行号和文件名
最常用写法是定义一个宏,把 std::source_location::current() 的调用“固定”在调用点展开:
#define LOG_LINE() std::source_location::current()
然后在日志函数中接收该参数(默认值避免每个调用都手动传):
void log(const char* msg, std::source_location loc = std::source_location::current()) {
printf("[%s:%d] %s\n", loc.file_name(), loc.line(), msg);
}
调用时直接 log("user logged in") 就能打出真实调用处的行号——因为宏没参与,std::source_location::current() 是在调用点编译期求值的。