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的编译器。
http://blog.csdn.net/hats8888/article/details/54171298
Qt程序调试之Q_ASSERT断言(条件为真则跳过,否则直接异常+崩溃)的更多相关文章
- Qt程序调试之Q_ASSERT断言(它是一个宏,接受布尔值,当其中的布尔值为真时,便什么也不做)
在使用Qt开发大型软件时,难免要调试程序,以确保程序内的运算结果符合我们的预期.在不符合预期结果时,就直接将程序断下,以便我们修改. 这就用到了Qt中的调试断言 - Q_ASSERT. 用一个小例子来 ...
- C++和QML混合的QT程序调试方法
以前调试只是QML或者只是C++的QT程序很简单,断点打上,直接debug按钮一点,喝一口水,自然就停在断点了. 这次遇到C++和QML混合的程序,把CONFIG+=declarative_debug ...
- VS2010 win7 QT4.8.0,实现VS2010编译调试Qt程序,QtCreator静态发布程序
下载源代码,注意一定是源码压缩包如qt-everywhere-opensource-src-4.8.0.zip, 不是Qt发布的已编译的不同版本的标准库如qt-win-opensource-4.8.0 ...
- 亲测VS2010纯静态编译QT4.8.0,实现VS2010编译调试Qt程序,QtCreator静态发布程序(图文并茂,非常详细)
下载源代码,注意一定是源码压缩包如qt-everywhere-opensource-src-4.8.0.zip,不是Qt发布的已编译的不同版本的标准库如qt-win-opensource-4.8.0- ...
- Ubuntu16.04下写的Qt程序,调试时没问题,运行时偶现崩溃 (需要在运行时生成core dump文件,QMAKE_CC += -g)
记录一下 Ubuntu16.04下写的Qt程序,调试时没问题,运行时偶现崩溃 需要在运行时生成core dump文件 首先在pro结尾里加入 QMAKE_CC += -g QMAKE_CXX += - ...
- [Python学习笔记][第八章Python异常处理结构与程序调试]
1/30 第八章Python异常处理结构与程序调试 异常处理 try-except结构 try: try块 except Exception: except块 try-except-else结构 tr ...
- 3、利用GDB进行程序调试
本文将用一个实际例子讲解如何通过GDB进行程序调试. 首先,我们需要理解的是GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,其产生和调试的目的是让调试者知道,程序在执行时内部发生了什么 ...
- 笔记:Python异常处理与程序调试
Python异常处理与程序调试 Python提供了强大的异常处理机制,通过捕获异常可以提高程序的健壮性.异常处理还具有释放对象,中止循环的运行等作用.在程序运行的过程中,如果发生了错误,可以返回事先约 ...
- python学习笔记(六)——程序调试
在我们平时编写程序时,常常会遇到各种错误,俗称BUG.而我们程序猿的工作常常需要对程序进行调试,也就是所谓的debug. 程序调试是将编制的程序投入实际运行前,用手工或编译程序等方法进行测试,修正语法 ...
随机推荐
- sed学习总结
sed学习总结 sed工作流 测试文件:cat employee.txt 101,John Doe,CEO 102,Jason Smith,IT Manager 103,Raj Reddy,Sysad ...
- Json入门 分类: C_OHTERS 2014-04-23 16:20 601人阅读 评论(0) 收藏
参考<疯狂android讲义>>730页 JSON的基础请参考W3SCHOOL的教程: http://www.w3school.com.cn/json/index.asp 例子: h ...
- Nginx的一些介绍
Apacheserver:http://httpd.apache.org,世界上用的最多的server,开放源码.支持跨平台,可移植性,模块支持丰富,虽速度和性能及内存消耗不及其它轻量级Webserv ...
- php课程 4-17 数组键值操作函数有哪些
php课程 4-17 数组键值操作函数有哪些 一.总结 一句话总结:多看学习视频 1.php中数组的键值操作函数有哪6个? • array_values();获取数组中的值• array_keys( ...
- #ifdef 的使用
1. _DEBUG #ifdef DEBUG的理解 首先需要注意的是,只有当前项目工作在 Debug(调试模式)(而不是Release(发布))设置下时编译器提供的宏定义.对于 visual stud ...
- 【76.83%】【codeforces 554A】Kyoya and Photobooks
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 基于 Android NDK 的学习之旅-----JNI 数据类型
经典老套流程,学编程语言东西,先学它最基础的数据类型,JNI也是如此.JNI 定义了一系列基本数据类型和引用数据类型与java想对应. 1.基本数据类型 下面一张表是描述了 Java 基本数据类型和J ...
- Distribution download cancelled. Using distribution from 'https://services.gradle.org/distributions/
Distribution download cancelled. Using distribution from ‘https://services.gradle.org/distributions/ ...
- web项目中配置多个数据源
web项目中配置多个数据源 spring + mybatis 多数据源配置有两种解决方案 1.配置多个不同的数据源,使用一个sessionFactory,在业务逻辑使用的时候自动切换到不同的数据源, ...
- matlab 运行 AlexNet
0. alexnet 工具箱下载 下载地址:Neural Network Toolbox(TM) Model for AlexNet Network 需要先注册(十分简单),登陆,下载: 下载完成之后 ...