zoukankan      html  css  js  c++  java
  • Qt程序调试之Q_ASSERT断言(条件为真则跳过,否则直接异常+崩溃)

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

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

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

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

    [cpp] view plain copy
     
     print?
    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的定义:

    [cpp] view plain copy
     
     print?
    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()是什么:

    [cpp] view plain copy
     
     print?
    1. inline void qt_noop(void) {}  

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

    将刚才的程序代码改成:

    [cpp] view plain copy
     
     print?
    1. Q_ASSERT(c == 7);  

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

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

    http://blog.csdn.net/hats8888/article/details/54171298

  • 相关阅读:
    mysql数据库之多表查询
    mysql数据库之单表查询
    mysql数据库之表和库
    mysql数据库之windows版本
    mysql数据库之linux版本
    mysql数据库之mysql下载与设置
    python基础之逻辑题(3)
    python基础之逻辑题(2)
    python基础之逻辑题(1)
    spring boot统一异常处理
  • 原文地址:https://www.cnblogs.com/findumars/p/7631947.html
Copyright © 2011-2022 走看看