2022-10-25 21:11:27
__FILE__和__LINE__是C++内置的预定义宏,分别用于获取当前源文件名和行号,主要用于调试日志、错误定位和断言增强,能显著提升问题排查效率。
一、基本作用输出可能为:
文件: main.cpp, 行: 5二、调试中的典型用法日志记录在日志中附加文件名和行号,快速定位问题位置。示例:
#define DEBUG_LOG(msg) std::cerr << "[" << __FILE__ << ":" << __LINE__ << "] " << msg << std::endlDEBUG_LOG("进入函数处理"); // 输出: [utils.cpp:23] 进入函数处理断言增强结合断言(如assert)输出更详细的错误信息。示例:
#define CHECK_PTR(p) if (!(p)) { std::cerr << "空指针检查失败!文件: " << __FILE__ << ", 行: " << __LINE__ << std::endl; abort(); }异常处理在异常捕获中记录出错位置,辅助定位问题。示例:
try { // 可能抛出异常的代码} catch (const std::exception& e) { std::cerr << "异常发生!文件: " << __FILE__ << ", 行: " << __LINE__ << ", 错误: " << e.what() << std::endl;}编译器自动维护无需手动定义,由编译器在预处理阶段替换为实际值。
__LINE__的动态性
每次使用时,__LINE__的值是调用处的实际行号。
在多行宏中,__LINE__对应宏展开的位置(而非宏定义的位置)。示例:
#define MULTI_LINE_MACRO() do { std::cout << "行号: " << __LINE__ << std::endl; } while (0)MULTI_LINE_MACRO(); // 输出宏调用处的行号路径格式差异不同编译器对__FILE__的路径处理可能不同(如完整路径、相对路径或仅文件名),需注意跨平台兼容性。
发布版本优化在发布版本中,可通过条件编译关闭调试输出,减少性能开销。示例:
#ifdef DEBUG #define DEBUG_LOG(msg) std::cerr << "[" << __FILE__ << ":" << __LINE__ << "] " << msg << std::endl#else #define DEBUG_LOG(msg)#endif合理使用__FILE__和__LINE__能大幅减少调试时间,尤其在大型项目或复杂逻辑中效果显著。