W Qt znajduje się makro Q_ASSERT. Jaka jest korzyść z używania tego zamiast assert z <cassert>
?Dlaczego Q_ASSERT zamiast assert
Odpowiedz
Q_ASSERT
jest zwyczaj makro assert, które rzekomo zwiększa standardową assert
funkcję.
Komunikat o błędzie jest obsługiwany przez qFatal()
, który może zachowywać się nieco lepiej na niektórych platformach niż standardowe makro assert. Na przykład w systemie Windows wyzwoli debuger Visual Studio w miejscu, w którym asercja nie powiedzie się, a nie tylko wywołanie abort()
.
Można również przekierować wyjściu funkcji komunikatów o błędach, takich jak Qt qFatal
do niestandardowej obsługi wiadomość (qInstallMessageHandler()). Może to być przydatne na przykład, jeśli chcesz przekierować komunikat o błędach do pliku.
Należy również pamiętać, że Q_ASSERT
jest wyłączona z makro QT_NO_DEBUG
(podczas assert
jest wyłączona NDEBUG
): może to zostać wykorzystane do oddzielić twierdzi między kodu związanego Qt i resztą.
Z tego samego dokumentu:
To nic nie robi jeśli QT_NO_DEBUG zostało zdefiniowane podczas kompilacji.
Więc pomyśl o tym: Q_ASSERT
nie jest uzależnione od braku NDEBUG
, jak assert
jest. #ifndef NDEBUG
jest wymagany, aby assert()
mógł cokolwiek zrobić, a także jest często używany do oddzielania innych ogólnych rzeczy związanych tylko z debagowaniem w kodzie użytkownika (i prawdopodobnie w bibliotece ..?).
Korzystanie z oddzielną makro jest korzyścią dla tych, którzy chcą, aby debugować tylko Qt związanych z rzeczy, bez wychodzenia NDEBUG
niezdefiniowana, a tym samym obciążając resztę kodu z debugowania tylko rzeczy, które będziemy uwędzić programu, jeżeli NDEBUG
nie jest zdefiniowany, w szczególności assert()
s.
Tak, można skompilować z -DNDEBUG
ale nie-DQT_NO_DEBUG
jeśli chciał skompilować „normalne” rzeczy z semantyki release-mode, ale nadal mają zastosowanie do debugowania Qt rzeczy.
Jest to bardzo przydatne przy opracowywaniu złożonej aplikacji GUI. Nie używam Qt (jeszcze?), Ale widzę korzyści z używania takich rzeczy w moich wybranych zestawach narzędzi GTK +/gtkmm [... które na pewno istnieję, ale jeszcze ich nie znałem ;-)]
pamiętam niedawne ożywioną dyskusję na ten temat tutaj, przeplatają się z dyskusji prostopadłym wniosku: ISO C++ Standard - Future Proposals › Exception stack trace information.
Tak, zauważyłem różne definicje debugowania, zastanawiałem się, czy jest coś więcej. Ale ma sens mieć taką możliwość. – Zitrax
- 1. Q_ASSERT release build semantics
- 2. Dlaczego używamy assert() i assert_options() w php?
- 3. assert nie zawiera elementu
- 4. NUnit: Słownik Assert
- 5. Kiedy używać assert() w Matlabie?
- 6. Dlaczego darcs zamiast git?
- 7. Dlaczego Objectify zamiast JDO?
- 8. Dlaczego monkeypatch Pythona nie działa podczas importowania klasy zamiast modułu?
- 9. mokka z nodejs dochodzić zawiesza/limity czasu dla assert (false) zamiast błędu
- 10. Co robi "#define assert (exp) ((void) 0)"?
- 11. Opóźnione NUnit Assert wiadomość ocenę
- 12. Przykładowe użycie assert w Pythonie?
- 13. Czy nie rozumiem użycia assert()?
- 14. Dlaczego używać krotek zamiast obiektów?
- 15. Dlaczego SELECT 0, ... zamiast SELECT
- 16. Dlaczego otrzymuję kwadraty zamiast tekstu?
- 17. Dlaczego NumPy zamiast list Pythona?
- 18. Dlaczego Windows GDI używa formatu RGBA zamiast "COLORREF" zamiast BGRA?
- 19. Dlaczego nie używać instrukcji assert Pythona w testach, w dzisiejszych czasach?
- 20. Puste "wydanie" ASSERT makr awarie programu?
- 21. Xcode - śledzenie stosu połączeń w assert?
- 22. Próby PHPUnit - metoda assert o nazwie
- 23. Assert/VerifyElementPresent z Python i WebDriver?
- 24. Swift assert mimo to wydrukować zmienne łańcucha
- 25. Junit assert lub stan w moim przypadku
- 26. numpy testowanie tablicy assert NIE równe
- 27. Jak zaimplementować komunikat XUnit descriptive Assert?
- 28. Rozszerzanie klasy xUnit Assert z nowym twierdzi
- 29. Dlaczego Arrays.sort przyjmuje Object [] zamiast Comparable []?
- 30. Dlaczego warto używać ROLAP zamiast zwykłego MySQL?
Na marginesie, jeśli chcesz dokładniej wyjaśnić, jak działają niestandardowe makra assert i dlaczego są przydatne, załóż ręce ** Wyciskając więcej z dowodu ** Steve'a Rabina w _Game Programming Gems_ – Louen