c++ - 在 C++ 中编写 Debug模式的标准方法

标签 c++ debugging

是否有“最佳实践”或类似的代码在 Debug模式下编码? 例如,

#include <iostream>

int main()
{
    #ifdef MY_DEBUG_DEF
    std::cout << "This is only printed if MY_DEBUG_DEF is defined\n";
    #endif

    return 0;
}

或者这被认为是不好的做法,因为代码变得有点困惑? 我注意到一些库(例如 libcurl,这是一个大型且著名的库)具有此功能;如果你用 libcurl 定义 VERBOSE,你基本上会得到一个 Debug模式

谢谢。

最佳答案

更常用的方法是遵循 assert(3) 中的约定: 用 #ifndef NDEBUG 包裹.... #endif代码只对调试有用,没有任何明显的副作用。

你甚至可以添加一些调试打印宏

extern bool wantdebug;
#ifndef NDEBUG
#define OUTDEBUG(Out) do { if (wantdebug) \
   std::cerr << __FILE__ << ":" << __LINE__ \
             << " " << Out << std::endl; \
} while(0)
#else
#define OUTDEBUG(Out) do {}while(0)
#endif

并使用类似 OUTDEBUG("x=" << x) 的东西在代码中的适当位置。那么wantdebug标志将通过调试器或一些程序参数设置。您可能想要发出换行符并刷新 cerr (或 cout ,或您自己的调试输出流)-使用 std::endl ...- 立即显示调试输出(这样您的程序将来崩溃时仍会提供合理的调试输出)。

关于c++ - 在 C++ 中编写 Debug模式的标准方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28737776/

相关文章:

c++ - 如何使用命令行在 C++ 中编译和链接分离的 .h 和 .cpp 文件?

c++ - 在 Visual Studio 中的 dll 内的函数处设置断点?

java - Eclipse 调试过滤不需要的包

c++ - 动态查找中位数而不用 C++ 为 O(n) 保存观察值

c++ - QSharedPointer::isNull() 和 operator!() 之间的区别

windows - Windows 上的 openocd 无效命令 "jtag",使用 olimex arm-usb-ocd-h jtag 加密狗,使用 phytec lpc3250 目标

google-chrome - 在Chrome开发者控制台中禁用对调试器的功能调用

xcode - 如何在Xcode 4中进行远程调试?

c++ - Astyle - 如何将不带大括号的条件格式化为 1TBS

c++ - 错误: expect a ';' before curly bracket [closed]