答案 0 :(得分:20)
Q_ASSERT
是一个自定义断言宏,据称可以增强标准assert
函数。
错误消息由 qFatal()
处理,在某些平台上的行为可能比标准的断言宏稍微好一些。例如,在Windows上,它将在断言失败的位置触发Visual Studio调试器,而不是仅调用abort()
。
您还可以将qFatal
等Qt错误消息功能的输出重定向到您的自定义消息处理程序(使用qInstallMessageHandler())。例如,如果要将错误消息重定向到文件,则可能很有用。
另请注意,使用宏Q_ASSERT
禁用QT_NO_DEBUG
(assert
禁用NDEBUG
):这可用于在Qt相关之间分隔断言代码和其余部分。
答案 1 :(得分:3)
来自同一份文件:
如果在编译期间定义了QT_NO_DEBUG,则不执行任何操作。
所以,请考虑一下:Q_ASSERT
并不取决于NDEBUG
的缺席,assert
。 #ifndef NDEBUG
需要assert()
才能执行任何操作,并且通常用于在用户(以及可能的库..?)代码中划分其他常规仅调试内容。
使用单独的宏对于那些想要仅调试与Qt相关的事情的人来说是一个好处,而不会使NDEBUG
未定义,从而使用仅调试的东西来减轻其余代码的负担。如果未定义NDEBUG
,则会使程序膨胀,特别是assert()
s。
所以,你可以用-DNDEBUG
进行编译,但不 -DQT_NO_DEBUG
,如果你想编译正常的'具有释放模式语义但仍然将调试应用于Qt的东西。
在开发复杂的GUI应用程序时,它确实非常有用。我不会使用Qt(但是?)但是看到在我选择的GTK + / gtkmm工具包中使用这些东西的好处[...我确定存在,但我还没有看过他们了;-)]
我记得最近关于这方面的动画讨论,与正交提案的讨论交织在一起:ISO C++ Standard - Future Proposals › Exception stack trace information.