1. 程式人生 > >Qt程式除錯之Q_ASSERT斷言

Qt程式除錯之Q_ASSERT斷言

在使用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的定義:

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
在Debug版程式中,Q_ASSERT會呼叫qt_assert函式,而在Release版程式中,便會呼叫qt_noop()函式,

再看看qt_noop()是什麼:

inline void qt_noop(void) {}
qt_noop就是一個內聯空函式,在Release版中將被優化掉。

將剛才的程式程式碼改成:

Q_ASSERT(c == 7);
並再次除錯執行,程式便不會被斷下了,因為表示式的值為真,已經符合我們的預期。

順便說一下,這個例子使用的是VC2013的編譯器。