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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM