Qt程序调试之Q_ASSERT断言

在使用Qt开发大型软件时,难免要调试程序,以确保程序内的运算结果符合我们的预期。在不符合预期结果时,就直接将程序断下,以便我们修改。

这就用到了Qt中的调试断言 - Q_ASSERT。

用一个小例子来说一下 Q_ASSERT 断言的作用吧:

用QtCreator新建一个控制台程序,代码编写如下:

#include <QtCore>

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    int a = 4,b = 3;
    int c = a + b;

    Q_ASSERT(c == 5);

    qDebug()<<"Finish";

    return app.exec();
}

注意:这里加上了

Q_ASSERT(c == 5);

一会将看到它的作用。

然后Debug编译,并启动调试,结果程序断下了,看图:


程序被断下,显示 c == 5,在第10行。

这就是Q_ASSERT的神奇之处!它是一个宏,接受布尔值,当其中的布尔值为真时,便什么也不做,当其中的布尔值为假时,便断下。

我们看看Q_ASSERT的定义:

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
在Debug版程序中,Q_ASSERT会调用qt_assert函数,而在Release版程序中,便会调用qt_noop()函数,

再看看qt_noop()是什么:

inline void qt_noop(void) {}
qt_noop就是一个内联空函数,在Release版中将被优化掉。

将刚才的程序代码改成:

Q_ASSERT(c == 7);
并再次调试运行,程序便不会被断下了,因为表达式的值为真,已经符合我们的预期。

顺便说一下,这个例子使用的是VC2013的编译器。



  • 16
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值