2016-08-08 57 views

回答

11

Q_ASSERT是一個自定義的斷言宏據稱提高了標準assert功能。

錯誤消息由qFatal()處理,它在某些平臺上的行爲可能會比標準斷言宏稍好。例如,在Windows上,它將在斷言失敗的位置觸發Visual Studio調試器,而不是僅調用abort()

可以重定向的Qt的錯誤信息功能的輸出,如qFatal到您的自定義消息處理程序(與qInstallMessageHandler())。例如,如果您想將錯誤消息重定向到一個文件,它會很有用。

還要注意的是Q_ASSERT是禁用宏QT_NO_DEBUG(而assertNDEBUG禁用):這可以用來分隔您的斷言Qt的相關代碼和休息之間。

+0

關於旁註,如果您想了解更多關於自定義斷言宏如何工作的原因以及它們爲何有用,請親手操作**史蒂夫拉賓在_Game Programming Gems_中更多地斷言斷言** – Louen

3

從同樣的文件:

它做什麼,如果QT_NO_DEBUG編譯時被定義。

所以,想一想:Q_ASSERT是不是沒有NDEBUG隊伍,爲assert是。對於assert()來說,需要#ifndef NDEBUG來執行任何操作,而且經常用來標定用戶(也可能是庫?)代碼中其他通用的僅用於調試的內容。

使用單獨的宏,是爲那些誰願意只調試Qt的相關事物的好處,不留NDEBUG不確定的,因而拖累的代碼僅調試的東西,其餘的是將臃腫的程序,如果NDEBUG沒有定義,特別是assert() s。

所以,你可以用-DNDEBUG編譯沒有-DQT_NO_DEBUG如果你想編譯發佈模式語義「正常」的事情,但仍然適用調試Qt的東西。

這在開發複雜的GUI應用程序時確實非常有用。我不使用Qt(但是?),但看到在我選擇的GTK +/gtkmm工具包中使用這些東西的好處[...我確信它存在,但我還沒有查看它們;-)]

我記得最近的一次熱烈的討論在這這裏,交織着正交建議進行討論:ISO C++ Standard - Future Proposals › Exception stack trace information.

+0

是的,我注意到不同的調試定義,我想知道是否有更多的東西。但有這種可能性是有道理的。 – Zitrax