2016-08-08 31 views

Antwort

11

Q_ASSERT ist ein Makro benutzerdefinierten assert, die den Standard assert Funktion verbessert angeblich.

Die Fehlermeldung wird von qFatal() behandelt, die auf einigen Plattformen als das standardmäßige Assert-Makro etwas besser verhalten kann. Unter Windows beispielsweise wird der Visual Studio-Debugger an dem Punkt ausgelöst, an dem die Assertion fehlschlägt, anstatt einfach abort() aufzurufen.

Sie können auch die Ausgabe von Meldefunktionen Qt Fehler umleiten wie qFatal zu Ihrem Handler benutzerdefinierte Nachricht (mit qInstallMessageHandler()). Dies kann beispielsweise nützlich sein, wenn Sie die Fehlermeldung in eine Datei umleiten möchten.

Beachten Sie auch, dass Q_ASSERT mit der Makro deaktiviert ist QT_NO_DEBUG (während assert von NDEBUG deaktiviert ist): Diese verwendet werden kann, trennen Ihr zwischen Qt-bezogenen Code und dem Rest behauptet.

+0

Nebenbei bemerkt, wenn Sie eine ausführlichere Erklärung darüber, wie benutzerdefinierte Assert-Makros arbeiten und warum sie nützlich sind, erhalten Sie Ihre Hände auf ** Quetschen mehr aus der Geltendmachung ** von Steve Rabin in _Game Programming Gems_ – Louen

3

Aus dem gleichen Dokument:

Es macht nichts, wenn QT_NO_DEBUG während der Kompilierung definiert wurde.

Also, denken Sie daran: Q_ASSERT auf das Fehlen von NDEBUG nicht abhängig ist, wie assert ist. #ifndef NDEBUG ist erforderlich für assert(), um etwas zu tun und wird auch oft verwendet, um andere allgemeine Debug-only-Dinge im Benutzer (und möglicherweise Bibliothek ..?) -Code abzugrenzen.

ein separates Makro ist ein Vorteil für diejenigen, die nur Qt-bezogene Dinge debuggen wollen würden, ohne NDEBUG undefined zu verlassen und damit den Rest des Codes mit Debug-nur Sachen zu beschweren, die das Programm aufblasen werden, wenn NDEBUG ist nicht definiert, insbesondere assert() s.

So können Sie mit -DNDEBUG kompilieren, aber nicht-DQT_NO_DEBUG wenn man will ‚normale‘ Dinge mit Release-Modus Semantik kompilieren, aber immer noch das Debuggen Qt Sachen anwenden.

Das ist sicherlich sehr nützlich bei der Entwicklung einer komplexen GUI-Anwendung. Ich benutze Qt (noch nicht?), Aber sehe den Vorteil, solche Dinge in meinen ausgewählten Toolkits von GTK +/gtkmm zu verwenden [... die ich sicher schon existiere, aber ich habe sie noch nicht nachgeschaut ;-)]

ich erinnere mich an eine aktuelle angeregte Diskussion zu diesem Thema hier, verwoben mit Diskussion eines orthogonalen Vorschlag: ISO C++ Standard - Future Proposals › Exception stack trace information.

+0

Ja, ich habe bemerkt, dass die verschiedenen Debug-Definitionen, ich fragte mich, ob es etwas mehr daran war. Aber es macht Sinn, diese Möglichkeit zu haben. – Zitrax