zoukankan      html  css  js  c++  java
  • Qt程序调试之Q_ASSERT断言(它是一个宏,接受布尔值,当其中的布尔值为真时,便什么也不做)

    在使用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
  • 相关阅读:
    一个简单的knockout.js 和easyui的绑定
    knockoutjs + easyui.treegrid 可编辑的自定义绑定插件
    Knockout自定义绑定my97datepicker
    去除小数后多余的0
    Windows Azure Web Site (15) 取消Azure Web Site默认的IIS ARR
    Azure ARM (1) UI初探
    Azure Redis Cache (3) 创建和使用P级别的Redis Cache
    Windows Azure HandBook (7) 基于Azure Web App的企业官网改造
    Windows Azure Storage (23) 计算Azure VHD实际使用容量
    Windows Azure Virtual Network (11) 创建VNet-to-VNet的连接
  • 原文地址:https://www.cnblogs.com/findumars/p/9265067.html
Copyright © 2011-2022 走看看