前言
在写代码的时候,难免会调试程序,确保某一个语句或运算结果符合预期,如果不是的话就将程序暂停,便于修改,那么这时候就要用到一个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) {}
建议大家在程序中多使用断言来进行判断逻辑,有助于尽早的发现并解决程序中隐藏的错误点。