Qt程式除錯之Q_ASSERT斷言
阿新 • • 發佈:2019-01-27
在使用Qt開發大型軟體時,難免要除錯程式,以確保程式內的運算結果符合我們的預期。在不符合預期結果時,就直接將程式斷下,以便我們修改。
這就用到了Qt中的除錯斷言 - Q_ASSERT。
用一個小例子來說一下 Q_ASSERT 斷言的作用吧:
用QtCreator新建一個控制檯程式,程式碼編寫如下:
#include <QtCore> int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); int a = 4,b = 3; int c = a + b; Q_ASSERT(c == 5); qDebug()<<"Finish"; return app.exec(); }
注意:這裡加上了
Q_ASSERT(c==5);一會將看到它的作用。
然後Debug編譯,並啟動除錯,結果程式斷下了,看圖:
程式被斷下,顯示 c == 5,在第10行。
這就是Q_ASSERT的神奇之處!它是一個巨集,接受布林值,當其中的布林值為真時,便什麼也不做,當其中的布林值為假時,便斷下。
我們看看Q_ASSERT的定義:
在Debug版程式中,Q_ASSERT會呼叫qt_assert函式,而在Release版程式中,便會呼叫qt_noop()函式,Q_CORE_EXPORT void qt_assert(const char *assertion, const char *file, int line); #if !defined(Q_ASSERT) # ifndef QT_NO_DEBUG # define Q_ASSERT(cond) ((!(cond)) ? qt_assert(#cond,__FILE__,__LINE__) : qt_noop()) # else # define Q_ASSERT(cond) qt_noop() # endif #endif
再看看qt_noop()是什麼:
inline void qt_noop(void) {}
qt_noop就是一個內聯空函式,在Release版中將被優化掉。
將剛才的程式程式碼改成:
Q_ASSERT(c == 7);
並再次除錯執行,程式便不會被斷下了,因為表示式的值為真,已經符合我們的預期。
順便說一下,這個例子使用的是VC2013的編譯器。