假设您的 C++ 编译器支持它们,是否有任何特殊理由 不 使用 __FILE__
、 __LINE__
和 __FUNCTION__
进行日志记录和调试?
我主要关心的是向用户提供误导性数据——例如,报告错误的行号或函数作为优化的结果——或者因此导致性能下降。
基本上,我可以相信 __FILE__
、 __LINE__
和 __FUNCTION__
总是 做正确的事吗?
原文由 Runcible 发布,翻译遵循 CC BY-SA 4.0 许可协议
假设您的 C++ 编译器支持它们,是否有任何特殊理由 不 使用 __FILE__
、 __LINE__
和 __FUNCTION__
进行日志记录和调试?
我主要关心的是向用户提供误导性数据——例如,报告错误的行号或函数作为优化的结果——或者因此导致性能下降。
基本上,我可以相信 __FILE__
、 __LINE__
和 __FUNCTION__
总是 做正确的事吗?
原文由 Runcible 发布,翻译遵循 CC BY-SA 4.0 许可协议
C++20 std::source_location
C++ 终于添加了一个非宏选项,当 C++20 普及时,它可能会在未来某个时候占据主导地位:
文档说:
constexpr const char* function_name() const noexcept;
6 返回:如果此对象表示函数体中的一个位置,则返回一个与函数名称对应的实现定义的 NTBS。否则,返回一个空字符串。
其中 NTBS 表示“空终止字节字符串”。
该功能存在于 GCC 11.2 Ubuntu 21.10 上,带有 -std=c++20
。它不在带有 g++-9 -std=c++2a
的 GCC 9.1.0 上。
https://en.cppreference.com/w/cpp/utility/source_location 显示用法是:
主文件
#include <iostream>
#include <string_view>
#include <source_location>
void log(std::string_view message,
const std::source_location& location = std::source_location::current()
) {
std::cout << "info:"
<< location.file_name() << ":"
<< location.line() << ":"
<< location.function_name() << " "
<< message << '\n';
}
int main() {
log("Hello world!");
}
编译并运行:
g++ -std=c++20 -Wall -Wextra -pedantic -o main.out main.cpp
./main.out
输出:
info:main.cpp:17:int main() Hello world!
__PRETTY_FUNCTION__
vs __FUNCTION__
vs __func__
vs std::source_location::function_name
回答于: PRETTY_FUNCTION、FUNCTION、func 有什么区别?
原文由 Ciro Santilli OurBigBook.com 发布,翻译遵循 CC BY-SA 4.0 许可协议
2 回答1.7k 阅读✓ 已解决
2 回答1k 阅读✓ 已解决
1 回答1.6k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
1 回答1.1k 阅读✓ 已解决
1 回答934 阅读
1 回答1.1k 阅读
__FUNCTION__
是非标准的,__func__
存在于 C99 / C++11 中。其他(__LINE__
和__FILE__
)就好了。它总是会报告正确的文件和行(如果您选择使用
__FUNCTION__
/__func__
,它会起作用)。优化不是一个因素,因为它是编译时宏扩展;它 永远不会 以任何方式影响性能。