2016-08-08 38 views

Odpowiedz

11

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

+0

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

3

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.

+0

Tak, zauważyłem różne definicje debugowania, zastanawiałem się, czy jest coś więcej. Ale ma sens mieć taką możliwość. – Zitrax