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

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

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

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

  1.  
    #include <QtCore>
  2.  
     
  3.  
    int main(int argc, char *argv[])
  4.  
    {
  5.  
    QCoreApplication app(argc, argv);
  6.  
     
  7.  
    int a = 4,b = 3;
  8.  
    int c = a + b;
  9.  
     
  10.  
    Q_ASSERT(c == 5);
  11.  
     
  12.  
    qDebug()<<"Finish";
  13.  
     
  14.  
    return app.exec();
  15.  
    }

注意:这里加上了

Q_ASSERT(c == 5);

一会将看到它的作用。

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

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

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

我们看看Q_ASSERT的定义:

  1.  
    Q_CORE_EXPORT void qt_assert(const char *assertion, const char *file, int line);
  2.  
     
  3.  
    #if !defined(Q_ASSERT)
  4.  
    # ifndef QT_NO_DEBUG
  5.  
    # define Q_ASSERT(cond) ((!(cond)) ? qt_assert(#cond,__FILE__,__LINE__) : qt_noop())
  6.  
    # else
  7.  
    # define Q_ASSERT(cond) qt_noop()
  8.  
    # endif
  9.  
    #endif

在Debug版程序中,Q_ASSERT会调用qt_assert函数,而在Release版程序中,便会调用qt_noop()函数,

再看看qt_noop()是什么:

inline void qt_noop(void) {}

qt_noop就是一个内联空函数,在Release版中将被优化掉。

将刚才的程序代码改成:

Q_ASSERT(c == 7);

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

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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hats8888/article/details/54171298

Qt程序调试之Q_ASSERT断言(它是一个宏,接受布尔值,当其中的布尔值为真时,便什么也不做)的更多相关文章

  1. Qt程序调试之Q_ASSERT断言(条件为真则跳过,否则直接异常+崩溃)

    在使用Qt开发大型软件时,难免要调试程序,以确保程序内的运算结果符合我们的预期.在不符合预期结果时,就直接将程序断下,以便我们修改. 这就用到了Qt中的调试断言 - Q_ASSERT. 用一个小例子来 ...

  2. C++和QML混合的QT程序调试方法

    以前调试只是QML或者只是C++的QT程序很简单,断点打上,直接debug按钮一点,喝一口水,自然就停在断点了. 这次遇到C++和QML混合的程序,把CONFIG+=declarative_debug ...

  3. [Python学习笔记][第八章Python异常处理结构与程序调试]

    1/30 第八章Python异常处理结构与程序调试 异常处理 try-except结构 try: try块 except Exception: except块 try-except-else结构 tr ...

  4. Keil 程序调试窗口

    上一讲中我们学习了几种常用的程序调试方法,这一讲中将介绍Keil提供各种窗口如输出窗口.观察窗口.存储器窗口.反汇编窗口.串行窗口等的用途,以及这些窗口的使用方法,并通过实例介绍这些窗口在调试中的使用 ...

  5. VS2010 win7 QT4.8.0,实现VS2010编译调试Qt程序,QtCreator静态发布程序

    下载源代码,注意一定是源码压缩包如qt-everywhere-opensource-src-4.8.0.zip, 不是Qt发布的已编译的不同版本的标准库如qt-win-opensource-4.8.0 ...

  6. 亲测VS2010纯静态编译QT4.8.0,实现VS2010编译调试Qt程序,QtCreator静态发布程序(图文并茂,非常详细)

    下载源代码,注意一定是源码压缩包如qt-everywhere-opensource-src-4.8.0.zip,不是Qt发布的已编译的不同版本的标准库如qt-win-opensource-4.8.0- ...

  7. Ubuntu16.04下写的Qt程序,调试时没问题,运行时偶现崩溃 (需要在运行时生成core dump文件,QMAKE_CC += -g)

    记录一下 Ubuntu16.04下写的Qt程序,调试时没问题,运行时偶现崩溃 需要在运行时生成core dump文件 首先在pro结尾里加入 QMAKE_CC += -g QMAKE_CXX += - ...

  8. 【系统篇】从int 3探索Windows应用程序调试原理

    探索调试器下断点的原理 在Windows上做开发的程序猿们都知道,x86架构处理器有一条特殊的指令——int 3,也就是机器码0xCC,用于调试所用,当程序执行到int 3的时候会中断到调试器,如果程 ...

  9. linux下QT程序输出乱码解决方法

    参考文章:http://blog.csdn.net/jiang1013nan/article/details/6667871 http://my.oschina.net/zjlaobusi/blog/ ...

随机推荐

  1. 基于vue的无缝滚动组件

    vue-seamless-scroll A simple, Seamless scrolling for Vue.js 在awesome上一直没有发现vue的无缝滚动组件,在工作之余写了个组件,分享出 ...

  2. 【Henu ACM Round#20 C】 Eevee

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 处理处所有的字符串可能的样子. 存在map里面就好. [代码] #include <bits/stdc++.h> usi ...

  3. iOS xib View宽高不能改变

    IOS - xib(Interface Builder,view) - can't change view size(view不能改变大小问题) 今天在试着swift语言写个demo,,当中遇到了这个 ...

  4. CAShapeLayer的简单介绍以及基本使用

    1.CAShapeLayer简单介绍  1.1CAShapeLayer继承于CALayer,能够使用CALayer的全部属性值:    1.2CAShapeLayer须要贝塞尔曲线配合使用才有意义(也 ...

  5. Android Design Support Library(一)用TabLayout实现类似网易选项卡动态滑动效果

    这里我们用TabLayout来实现这一效果.TabLayout是Android Design Support Library库中的控件.Google在2015的IO大会上,给我们带来了更加详细的Mat ...

  6. MHP 宿舍摄像头在门卫显示方案

    通过VPN拨入公司内网,实现访问外网摄像头. 1.  宿舍和MHP公司各增加一条上网线路(可用移动) 2.宿舍处理:  2台带TF卡 摄像头,加入到萤石云端   130万摄像头+64G TF卡 3.宿 ...

  7. Flask--Python中常用的Web框架之一

    Web框架 什么是框架? 协助开发者快速开发web应程序的一套功能代码 开发者只需要按照框架约定要求,在指定位置写上自己的业务逻辑代码即可 为什么要用web框架? 使用web框架的主要目的就是避免重复 ...

  8. 关于Java的10个谎言

    以下的这些都算是比較高级的问题了.面试中一般也非常少问到.由于它们可能会把面试者拒之门外.只是你能够自己找个时间来实践一下. System.exit(0)会跳过finally块的运行 System.s ...

  9. zoj 2317 Nice Patterns Strike Back(矩阵乘法)

    problemId=1317">http://acm.zju.edu.cn/onlinejudge/showProblem.do? problemId=1317 给出一个n*m的矩阵( ...

  10. Bmob移动后端云服务平台--Android从零開始--(一)何为Bmob

    Bmob移动后端云服务平台--Android从零開始--(一)何为Bmob 在正式的项目开发中,单client不能满足我们的需求,须要实现client与服务端的连接. 而在编写Android服务端代码 ...