在Qt中有一個Q_ASSERT宏。使用此代替<cassert>
的assert有什麼優勢?爲什麼Q_ASSERT而不是斷言
回答
Q_ASSERT
是一個自定義的斷言宏據稱提高了標準assert
功能。
錯誤消息由qFatal()
處理,它在某些平臺上的行爲可能會比標準斷言宏稍好。例如,在Windows上,它將在斷言失敗的位置觸發Visual Studio調試器,而不是僅調用abort()
。
也可以重定向的Qt的錯誤信息功能的輸出,如qFatal
到您的自定義消息處理程序(與qInstallMessageHandler())。例如,如果您想將錯誤消息重定向到一個文件,它會很有用。
還要注意的是Q_ASSERT
是禁用宏QT_NO_DEBUG
(而assert
由NDEBUG
禁用):這可以用來分隔您的斷言Qt的相關代碼和休息之間。
從同樣的文件:
它做什麼,如果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.
是的,我注意到不同的調試定義,我想知道是否有更多的東西。但有這種可能性是有道理的。 – Zitrax
- 1. 爲什麼在主,而不是在調用斷言
- 2. 爲什麼斷言:android.net.cts.ListeningPortsTest :: testNoListeningUdp6Ports
- 3. 爲什麼斷言失敗
- 4. 爲什麼斷言不相等?
- 5. 什麼是斷言?你爲什麼要使用它們?
- 6. 爲什麼斷言追加默認斷言消息
- 7. 爲什麼=而不是:?
- 8. WS-I BP2012斷言是什麼意思?
- 9. 什麼是Java中使用斷言的
- 10. 是什麼讓CLR顯示斷言?
- 11. 什麼是斷言失敗的原因
- 12. 爲什麼我得到斷言錯誤?
- 13. 爲什麼斷言是從生產版本編譯而來(性能除外)?
- 14. 爲什麼我們的Hamcrest斷言不被認爲是規則S2699的有效斷言?
- 15. 爲什麼a.out不是機器語言?
- 16. 爲什麼語言是不是裝的?我做錯了什麼?
- 17. 爲什麼retainCount是0而不是1?
- 18. 'num_of_cmt'是4而不是2。爲什麼?
- 19. 爲什麼DateTime.Now.Year是int而不是ushort
- 20. 爲什麼爲(;;)而不是while(1)?
- 21. 「簡而言之」是什麼意思
- 22. 爲什麼這個對稱斷言是錯誤的?
- 23. 是什麼,而不
- 24. 摩卡用的NodeJS斷言掛起/超時的斷言(假),而不是錯誤
- 25. 什麼是軌道與語言,而是用不同的格式
- 26. 我得到斷言錯誤,我不知道爲什麼
- 27. Oauth2斷言授權:爲什麼不刷新令牌?
- 28. 爲什麼std :: regex_match不支持「零長度斷言」?
- 29. 爲什麼不摩卡有一個內置的斷言定義
- 30. 爲什麼在部署中不使用斷言
關於旁註,如果您想了解更多關於自定義斷言宏如何工作的原因以及它們爲何有用,請親手操作**史蒂夫拉賓在_Game Programming Gems_中更多地斷言斷言** – Louen