为什么Q_ASSERT而不是断言

时间:2016-08-08 14:31:53

标签: qt assert assertions

在Qt中有一个Q_ASSERT宏。使用此功能的优势是什么,而不是<cassert>中的assert

2 个答案:

答案 0 :(得分:20)

Q_ASSERT是一个自定义断言宏,据称可以增强标准assert函数。

错误消息由 qFatal() 处理,在某些平台上的行为可能比标准的断言宏稍微好一些。例如,在Windows上,它将在断言失败的位置触发Visual Studio调试器,而不是仅调用abort()

您还可以qFatal等Qt错误消息功能的输出重定向到您的自定义消息处理程序(使用qInstallMessageHandler())。例如,如果要将错误消息重定向到文件,则可能很有用。

另请注意,使用宏Q_ASSERT禁用QT_NO_DEBUGassert禁用NDEBUG):这可用于在Qt相关之间分隔断言代码和其余部分。

答案 1 :(得分:3)

来自同一份文件:

  

如果在编译期间定义了QT_NO_DEBUG,则不执行任何操作。

所以,请考虑一下:Q_ASSERT并不取决于NDEBUG的缺席,assert#ifndef NDEBUG需要assert()才能执行任何操作,并且通常用于在用户(以及可能的库..?)代码中划分其他常规仅调试内容。

使用单独的宏对于那些想要仅调试与Qt相关的事情的人来说是一个好处,而不会使NDEBUG未定义,从而使用仅调试的东西来减轻其余代码的负担。如果未定义NDEBUG,则会使程序膨胀,特别是assert() s。

所以,你可以用-DNDEBUG进行编译,但 -DQT_NO_DEBUG,如果你想编译正常的&#39;具有释放模式语义但仍然将调试应用于Qt的东西。

在开发复杂的GUI应用程序时,它确实非常有用。我不会使用Qt(但是?)但是看到在我选择的GTK + / gtkmm工具包中使用这些东西的好处[...我确定存在,但我还没有看过他们了;-)]

我记得最近关于这方面的动画讨论,与正交提案的讨论交织在一起:ISO C++ Standard - Future Proposals › Exception stack trace information.