Qt 断言的使用 Q_ASSERT

前言

在写代码的时候,难免会调试程序,确保某一个语句或运算结果符合预期,如果不是的话就将程序暂停,便于修改,那么这时候就要用到一个Qt 中的调试神器—Q_ASSERT(断言)。
所谓的断言,其实很简单,它是一个宏定义,接受一个布尔值,当判断的语句为真时,不做任何操作,如果判断的语句为假,那么在 debug 模式下程序运行到该地方会自动断下,并弹出一个系统消息框,并且在程序输出栏会打印出断言的位置,可以快捷的进入到该位置,便于进行修改。

正文

写一个很简单的调试程序来看一下:

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    QPushButton * btn = NULL;

    Q_ASSERT(btn);

    btn = new QPushButton(this);

    Q_ASSERT(btn);
}

这里显示定义一个 QPushButton 对象,并初始化为 NULL,然后添加断言,运行程序后自动弹出一个系统错误框:(我这里是用的 Mac 编译的)

并且程序输出日志也有相应的提示:

这就是 Q_ASSERT 的神奇之处,在调试 Qt 程序的时候非常方便。
来看看它的源码:

Q_CORE_EXPORT void qt_assert(const char *assertion, const char *file, int line);  

#if !defined(Q_ASSERT)  
#  ifndef QT_NO_DEBUG  
#    define Q_ASSERT(cond) ((!(cond)) ? qt_assert(#cond,__FILE__,__LINE__) : qt_noop())  
#  else  
#    define Q_ASSERT(cond) qt_noop()  
#  endif  
#endif 

在QT_NO_DEBUG 模式下,也就是调试模式下程序会执行qt_assert(),在 Release 模式下执行qt_noop()函数,而 qt_noop()函数是一个内联空函数,什么都不做,定义如下:

inline void qt_noop(void) {}  

建议大家在程序中多使用断言来进行判断逻辑,有助于尽早的发现并解决程序中隐藏的错误点。

猜你喜欢

转载自blog.csdn.net/luoyayun361/article/details/80248181
今日推荐