在C++中使用 DEBUG 宏的原因是什么?



我正在研究其他人构建C++程序,并看到很多这样的DEBUG用途

#ifdef DEBUG
    cout << "Value is "<< value << endl;
#endif

我自己还在学习成为一个富裕的C++程序员的过程中,我主要使用Visual Studio和断点进行调试。所以我想知道,如果我能够单步执行代码来调试值,还有其他理由使用这些类型的宏吗?

试图谷歌,但没有找到太多有用的页面。

谢谢。

有时您不想单步执行整个代码,而只想检查终端中的输出。

如果代码是在定义DEBUG的情况下编译的,则可能在调试版本中,您会看到输出。对于发布版本,则不会。如果转到项目设置 -> 配置属性 -> C/C++ -> 预处理器 -> 预处理器定义,您将看到DEBUG是为调试版本定义的,但它不是用于发布。(我其实有_DEBUG

想象一下,你有一个巨大的函数,你感兴趣的是第 1000 行(它是旧代码,无法更改它)。您是愿意逐步浏览所有这些混乱的遗留代码,还是在关键点有有用的调试语句?您是希望控制台告诉您哪里出了问题,还是在失败位置的 237 个return语句中的每一个设置断点?

调试时,通常会在屏幕上转储一些中间值。可视调试器并不总是有帮助,因为您浪费了大量时间使用鼠标进行操作。

对"文本模式调试"和日志记录的需求也经常来自嵌入式系统体验,您没有太多的视觉帮助,您所能做的就是将一两个字节转储到串行端口或类似的东西。当您习惯于快速查找关键调试点时,只需在其中插入一些打印代码,其值检查程序的正确性。

"DEBUG"宏由 MSVC++ 编译器定义,同时在调试模式下编译项目。当你制作发布版本时,所有对最终用户实际上无用的代码都被预处理器"剥离"。

典型代码段

#ifdef DEBUG
Some code
#endif

如果未定义 DEBUG,则由预处理器删除。

使用控制台输出而不是调试器来识别多线程错误可能很方便。 通过断点中断程序流通常会阻止错误发生,因为它会阻止线程相互踩到对方的脚趾。 其他基于计时的错误也是如此。

"我主要使用Visual Studio和断点进行调试"
在某些情况下,通过逐步观察代码的行为来调试代码是非常困难的,甚至是不可能的。有时,创建这种"调试输出"更容易,以便您从这些日志中看到发生了什么,而不是尝试实时逐步执行它。

检查是否定义了DEBUG符号是为了确保您的发布版本不会进行此类输出。请注意,Visual Studio 定义了调试配置_DEBUG。更具体地说:"编译器在指定/MTd 或/MDd 选项时定义_DEBUG。这些选项指定 C 运行时库的调试版本。还有一些NDEBUG在定义时禁用 C 样式断言。有关更多信息,请查看_DEBUG vs NDEBUG。

它用于调试,通过将代码包装在预处理器命令中,您可以打开或关闭该代码。

看这里: C++ 注释:预处理器

很简单,当你想获得一些可以帮助你进行"软"调试的消息时,你只需定义 DEBUG,#ifdef DEBUG#endif 之间的句子就会生效,并在你的情况下得到一些有用的消息。

这样,当您完成开发并想要发布时,您只需取消定义调试,消息将不再出现。

您可能会认为是的,这是一个好主意,但是应用程序的更多代码,但好的一点是这些是宏并在编译时进行评估,因此,如果您删除所有宏,该应用程序将相同:)

我建议不要使用DEBUG宏。请改用标准NDEBUG宏,该宏是在不需要调试代码时定义的,而不是在需要调试代码时定义的。也就是说,默认情况下使调试代码处于活动状态。您会发现,只有一小部分性能关键型代码核心需要关闭调试检查才能获得足够的性能。

最新更新