<QtAssert> 代理页面

函数

T *q_check_ptr(T *p)

voidQ_ASSERT(bool test)
voidQ_ASSERT_X(bool test, const char *where, const char *what)
voidQ_CHECK_PTR(void *pointer)
voidQ_UNREACHABLE
(since 6.5) voidQ_UNREACHABLE_RETURN(...)

函数文档

template <typename T> T *q_check_ptr(T *p)

使用 Q_CHECK_PTRp 进行检查,然后返回 p.

这可以作为 Q_CHECK_PTR 的内联版本使用。

宏文档

void Q_ASSERT(bool test)

如果 testfalse,打印包含源代码文件名和行号的警告消息。

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)

如果 testfalse,则打印消息 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)

如果指针nullptr,则打印包含源代码文件名和行号的提示信息,指出程序内存不足并终止程序执行。如果启用了异常,它将抛出std::bad_alloc

如果编译时定义了QT_NO_DEBUGQT_NO_EXCEPTIONS,则Q_CHECK_PTR不会执行任何操作。因此,您不应使用Q_CHECK_PTR来检查成功的内存分配,因为在某些情况下检查将被禁用。

示例

int *a;

Q_CHECK_PTR(a = new int[80]);   // WRONG!

a = new (nothrow) int[80];      // Right
Q_CHECK_PTR(a);

另请参阅qWarning()和调试技术

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强制执行以方便调试。

注意:使用宏Q_UNREACHABLE_RETURN()向需要它们的编译器插入返回语句,而不会导致对抱怨其存在的编译器的警告。

另请参阅Q_ASSERT()、qFatal()和Q_UNREACHABLE_RETURN

[自6.5起] void Q_UNREACHABLE_RETURN(...)

这相当于

Q_UNREACHABLE();
return __VA_ARGS__;

除了它省略了编译器会发出警告的返回语句。

此宏在Qt 6.5中引入。

另请参阅Q_UNREACHABLE

© 2024 Qt公司有限公司。此处包含的文档贡献者是各自所有者的版权。此处提供的文档是根据自由软件基金会发布的GNU自由文档许可证版本1.3许可的。Qt及其相关标志是芬兰和/或全世界Qt公司有限公司的商标。所有其他商标归各自所有者所有。