直接说结论:C++20 用 std::source_location 最可靠;老标准只能靠预定义宏(__func____FILE____LINE__),但这些宏本质上是编译器注入的静态字符数组,既不是函数调用,也不能传参或延迟求值,稍不注意就踩坑。下面展开聊聊,到底怎么回事。

为什么 __func__ 不是标准函数,也不能取地址

__func__ 是编译器在每个函数作用域内自动注入的静态字符数组,比如 static const char __func__[] = "foo";。它本质上是个隐含的局部变量,但它的行为很特殊——不能参与常规的表达式求值时机控制。

std::source_location 怎么用才不掉坑

它是 C++20 引入的轻量结构体,通过编译器内置支持生成调用点信息(函数名、文件、行号、列号)。关键点在于:它默认构造时捕获的是调用点,而不是定义点。但前提是——你必须显式调用 ::current() 方法。

void log(const char* msg, const std::source_location& loc = std::source_location::current()) {    std::cout << loc.file_name() << ":" << loc.line()              << " [" << loc.function_name() << "] " << msg << "\n";}// 调用处自动捕获当前行和函数名log("start processing"); // 输出:main.cpp:42 [main] start processing

预定义宏在日志宏里的典型误用与修复

很多人写日志宏时直接拼接 __FILE____LINE__,却忽略了宏展开时机问题——它们总在宏体内部展开,而不是调用位置。这是个常见的翻车现场。

话说回来,真正麻烦的从来不是“怎么拿到名字”,而是“拿到的是哪一层的名字”——宏、内联、模板实例化、lambda 都会让 __func__source_location 指向意料之外的位置。调试时多打几行 std::source_location::current() 对比,比查文档更快定位问题。

C++如何获取当前函数名和行号 _ 预定义宏与source_location【干货】

本文转载于:https://www.php.cn/faq/2334104.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。