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
  • 相关阅读:
    第五章 相关分析 第三组作业
    作业二 网调问卷制作
    作业一 统计软件简介与数据操作
    Map Reduce Shuffle
    springboot druid 多数据源配置
    Storm Stream grouping
    大专+高级证书 人才引进广州。
    First Article
    批量选择图片
    模态框
  • 原文地址:https://www.cnblogs.com/findumars/p/9265067.html
Copyright © 2011-2022 走看看