为什么 Q_ASSERT 而不是断言

Why Q_ASSERT instead of assert

在 Qt 中有一个 Q_ASSERT macro. What's the advantage of using this instead of assert 来自 <cassert> ?

来自同一份文件:

It does nothing if QT_NO_DEBUG was defined during compilation.

所以,想一想:Q_ASSERT 并不取决于 NDEBUG 的缺席,而 assert 是。 #ifndef NDEBUGassert() 执行任何操作所必需的,并且还经常用于在用户(可能还有库..?)代码中划分其他一般仅调试的内容。

使用单独的宏对于那些只想调试与 Qt 相关的东西的人来说是一个好处,而不会留下 NDEBUG 未定义,从而用仅调试的东西来压低其余代码如果未定义 NDEBUG,特别是 assert()s.

,则会使程序膨胀

所以,你可以用 -DNDEBUG 编译,但 不能 -DQT_NO_DEBUG 如果你想用发布模式语义编译 'normal' 东西但是仍然对 Qt 应用调试。

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

我记得最近在这里对此进行了一次生动的讨论,与正交提案的讨论交织在一起:ISO C++ 标准 - 未来提案 › 异常堆栈跟踪信息。

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

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

您还可以重定向 Qt 错误消息函数的输出,例如 qFatal 到您的自定义消息处理程序(使用 qInstallMessageHandler() )。例如,如果您想将错误消息重定向到文件,它会很有用。

另请注意,Q_ASSERT 被宏 QT_NO_DEBUG 禁用(而 assertNDEBUG 禁用):这可用于在 Qt 之间分隔断言-相关代码及其他。