__FILE__、__LINE__ 和 __FUNCTION__ 在 C 中的用法

新手上路,请多包涵

假设您的 C++ 编译器支持它们,是否有任何特殊理由 使用 __FILE____LINE____FUNCTION__ 进行日志记录和调试?

我主要关心的是向用户提供误导性数据——例如,报告错误的行号或函数作为优化的结果——或者因此导致性能下降。

基本上,我可以相信 __FILE____LINE____FUNCTION__ 总是 做正确的事吗?

原文由 Runcible 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

__FUNCTION__ 是非标准的, __func__ 存在于 C99 / C++11 中。其他( __LINE____FILE__ )就好了。

它总是会报告正确的文件和行(如果您选择使用 __FUNCTION__ / __func__ ,它会起作用)。优化不是一个因素,因为它是编译时宏扩展;它 永远不会 以任何方式影响性能。

原文由 Evan Teran 发布,翻译遵循 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_FUNCTIONFUNCTIONfunc 有什么区别?

原文由 Ciro Santilli OurBigBook.com 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏