Qt 为什么Q_断言而不是断言

Qt 为什么Q_断言而不是断言,qt,assert,assertions,Qt,Assert,Assertions,在Qt中有一个宏。使用此文档而不是来自同一文档的有什么好处?: 如果在编译过程中定义了QT_NO_DEBUG,则不会执行任何操作 因此,想想看:Q\u ASSERT并不像ASSERT那样,取决于是否存在NDEBUG#ifndef NDEBUG是assert()执行任何操作所必需的,并且通常用于在用户代码(可能还有库..?)中划分其他仅用于调试的常规内容 对于那些只想调试Qt相关内容的人来说,使用一个单独的宏是一个好处,而不需要保留未定义的NDEBUG,从而用只调试的内容来衡量代码的其余部分,如果

在Qt中有一个宏。使用此文档而不是来自同一文档的
有什么好处?

如果在编译过程中定义了QT_NO_DEBUG,则不会执行任何操作

因此,想想看:
Q\u ASSERT
并不像
ASSERT
那样,取决于是否存在
NDEBUG
<代码>#ifndef NDEBUG是
assert()
执行任何操作所必需的,并且通常用于在用户代码(可能还有库..?)中划分其他仅用于调试的常规内容

对于那些只想调试Qt相关内容的人来说,使用一个单独的宏是一个好处,而不需要保留未定义的
NDEBUG
,从而用只调试的内容来衡量代码的其余部分,如果未定义
NDEBUG
,尤其是
assert()
s,这些内容将使程序膨胀

因此,如果您想编译具有发布模式语义的“正常”内容,但仍对Qt内容应用调试,则可以使用
-DNDEBUG
进行编译,但不能使用
-DQT\u NO\u DEBUG

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


我回忆起最近关于这一点的生动讨论,与一个正交方案的讨论交织在一起:

Q\u ASSERT
是一个自定义ASSERT宏,据说它增强了标准的
ASSERT
功能

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

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


还要注意的是,
Q\u ASSERT
被宏
QT\u NO\u DEBUG
禁用(而
ASSERT
NDEBUG
禁用):这可以用来区分QT相关代码和其他代码之间的断言。

是的,我注意到了不同的调试定义,我想知道是否还有更多。但有这样的可能性是有道理的。另外,如果你想更详细地解释自定义断言宏是如何工作的,以及它们为什么有用,那么你可以在《游戏编程珍宝》中从史蒂夫·拉宾(Steve Rabin)的断言中挤出更多内容