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
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