Qt程序调试之Q_ASSERT断言
2017-01-07 10:58
337 查看
在使用Qt开发大型软件时,难免要调试程序,以确保程序内的运算结果符合我们的预期。在不符合预期结果时,就直接将程序断下,以便我们修改。
这就用到了Qt中的调试断言 - Q_ASSERT。
用一个小例子来说一下 Q_ASSERT 断言的作用吧:
用QtCreator新建一个控制台程序,代码编写如下:
注意:这里加上了
一会将看到它的作用。
然后Debug编译,并启动调试,结果程序断下了,看图:
![](https://img-blog.csdn.net/20170107104414980?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGF0czg4ODg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
程序被断下,显示 c == 5,在第10行。
这就是Q_ASSERT的神奇之处!它是一个宏,接受布尔值,当其中的布尔值为真时,便什么也不做,当其中的布尔值为假时,便断下。
我们看看Q_ASSERT的定义:
再看看qt_noop()是什么:
将刚才的程序代码改成:
顺便说一下,这个例子使用的是VC2013的编译器。
这就用到了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的编译器。
相关文章推荐
- QT学习 第一章:基本对话框
- 使用Shiboken为C++和Qt库创建Python绑定
- Qt 5.6更新至RC版,最终版本近在咫尺
- Assert(断言实现机制深入剖析)
- Qt定时器和随机数详解
- Qt实现图片移动实例(图文教程)
- C++ Qt属性系统详细介绍
- Qt for Android开发实例教程
- Java陷阱之assert关键字详解
- Python中断言Assertion的一些改进方案
- python中assert用法实例分析
- QModelIndex/Role/Model介紹<二>
- Qt Model/View/Delegate浅谈 - QAbstractListModel
- Qt Model/View/Delegate浅谈 - roleNames()
- QT历程(一):与CryptoJs对应的AES加密
- 基于PyQt5的快速开发框架QFramer
- OSX下安装PyQt
- ok6410开发板移植DirectFB手记
- 【笔记】给Qt内嵌一个Chrome吧
- 【算法】最短路径之A*搜索