<QtAssert>
用于开发和调试期间条件检查的宏。更多...
| Header: | #include <QtAssert> |
函数
| T * | q_check_ptr(T *p) |
宏
| void | Q_ASSERT(bool test) |
| void | Q_ASSERT_X(bool test, const char *where, const char *what) |
| void | Q_CHECK_PTR(void *pointer) |
(since 6.11) void | Q_PRESUME(bool expr) |
| void | Q_UNREACHABLE() |
(since 6.5) void | Q_UNREACHABLE_RETURN(...) |
宏文档
void Q_ASSERT(bool test)
如果test 的值是false ,则打印一条包含源代码文件名和行号的警告信息。
Q_ASSERT() 用于在开发过程中测试先决条件和后置条件。如果QT_NO_DEBUG 在编译时已被定义,则该函数不执行任何操作。
示例:
// File: div.cpp
#include <QtGlobal>
int divide(int a, int b)
{
Q_ASSERT(b != 0);
return a / b;
}如果 `b ` 为零,`Q_ASSERT` 语句将使用 `qFatal()` 函数输出以下消息:
ASSERT: "b != 0" in file div.cpp, line 7另请参阅 Q_ASSERT_X()、qFatal() 以及《调试技术》。
void Q_ASSERT_X(bool test, const char *where, const char *what)
如果test 的值为false ,则会输出消息“what ”,并附上位置where 、源文件名及行号。
Q_ASSERT_X 用于在开发过程中测试先决条件和后置条件。如果编译时已定义QT_NO_DEBUG ,则该函数不执行任何操作。
示例:
// File: div.cpp
#include <QtGlobal>
int divide(int a, int b)
{
Q_ASSERT_X(b != 0, "divide", "division by zero");
return a / b;
}如果b 为零,Q_ASSERT_X 语句将使用qFatal() 函数输出以下消息:
ASSERT failure in divide: "division by zero", file div.cpp, line 7另请参阅 Q_ASSERT()、qFatal() 以及《调试技术》。
void Q_CHECK_PTR(void *pointer)
如果pointer 为nullptr ,则会输出包含源代码文件名和行号的消息,提示程序内存不足并终止程序执行。如果启用了异常处理,则会抛出std::bad_alloc 异常。
如果编译时定义了QT_NO_DEBUG 和QT_NO_EXCEPTIONS ,则Q_CHECK_PTR将不执行任何操作。因此,切勿使用Q_CHECK_PTR来检查内存分配是否成功,因为在某些情况下该检查会被禁用。
示例:
int *a;
Q_CHECK_PTR(a = new int[80]); // WRONG!
a = new (std::nothrow) int[80]; // Right
Q_CHECK_PTR(a);[since 6.11] void Q_PRESUME(bool expr)
使编译器将expr 视为true 。
当编译器支持时,该宏会生成Q_ASSERT() 以及 C++23 风格的[[assume]] 属性。否则,它将回退到Q_ASSERT()。
该宏在 Qt 6.11 中引入。
另请参阅 Q_ASSERT()、Q_UNREACHABLE()、Q_LIKELY() 以及Q_ASSUME()。
void Q_UNREACHABLE()
告知编译器当前位置在任何执行过程中都无法被到达,因此编译器可将通往此处的任何代码路径以及从此处继续的代码作为死代码进行优化。
该宏可用于标记不可能发生的条件。例如,给定以下枚举:
enum Shapes {
Rectangle,
Triangle,
Circle,
NumShapes
};可以编写如下所示的 switch 表:
switch (shape) {
case Rectangle:
return rectangle();
case Triangle:
return triangle();
case Circle:
return circle();
case NumShapes:
Q_UNREACHABLE();
break;
}在该处插入 Q_UNREACHABLE() 的优势在于,它会告知编译器不要为包含该值的 shape 变量生成代码。如果缺少该宏,编译器仍会为该值生成必要的比较操作。 如果删除了 case 标签,某些编译器可能会发出警告,指出某些枚举值未被检查。
通过在不可能成立的条件中使用此宏,可以消除死代码路径,从而提高代码覆盖率。
在调试版本中,该条件通过断言(assert)强制执行,以便于调试。
注意: 对于需要 return 语句的编译器,请使用 宏Q_UNREACHABLE_RETURN() 来插入 return 语句,同时不会对那些因该宏的存在而报错的编译器产生警告。
另请参阅 Q_ASSERT()、qFatal()、Q_UNREACHABLE_RETURN() 和Q_PRESUME()。
[since 6.5] void Q_UNREACHABLE_RETURN(...)
这相当于
Q_UNREACHABLE();
return __VA_ARGS__;,只不过在那些会对此发出警告的编译器上,它省略了 return 语句。
该宏在 Qt 6.5 中引入。
另请参阅 Q_UNREACHABLE() 和Q_PRESUME()。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.