为什么 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 NDEBUG
是 assert()
执行任何操作所必需的,并且还经常用于在用户(可能还有库..?)代码中划分其他一般仅调试的内容。
使用单独的宏对于那些只想调试与 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
禁用(而 assert
被 NDEBUG
禁用):这可用于在 Qt 之间分隔断言-相关代码及其他。
在 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 NDEBUG
是 assert()
执行任何操作所必需的,并且还经常用于在用户(可能还有库..?)代码中划分其他一般仅调试的内容。
使用单独的宏对于那些只想调试与 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
禁用(而 assert
被 NDEBUG
禁用):这可用于在 Qt 之间分隔断言-相关代码及其他。