<QtAssert> Proxy-Seite

Funktionen

T *q_check_ptr(T *p)

Makros

void Q_ASSERT(bool test)
void Q_ASSERT_X(bool test, const char *where, const char *what)
void Q_CHECK_PTR(void *pointer)
void Q_UNREACHABLE
(since 6.5) void Q_UNREACHABLE_RETURN(...)

Funktions-Dokumentation

template <typename T> T *q_check_ptr(T *p)

Verwendet Q_CHECK_PTR auf p und gibt dann p zurück.

Dies kann als Inline-Version von Q_CHECK_PTR verwendet werden.

Makro-Dokumentation

void Q_ASSERT(bool test)

Gibt eine Warnmeldung mit dem Namen der Quellcodedatei und der Zeilennummer aus, wenn test false ist.

Q_ASSERT() ist nützlich, um Vor- und Nachbedingungen während der Entwicklung zu testen. Es tut nichts, wenn QT_NO_DEBUG während der Kompilierung definiert wurde.

Beispiel:

// File: div.cpp

#include <QtGlobal>

int divide(int a, int b)
{
    Q_ASSERT(b != 0);
    return a / b;
}

Wenn b gleich Null ist, gibt die Q_ASSERT-Anweisung die folgende Meldung unter Verwendung der Funktion qFatal() aus:

ASSERT: "b != 0" in file div.cpp, line 7

Siehe auch Q_ASSERT_X(), qFatal(), und Debugging-Techniken.

void Q_ASSERT_X(bool test, const char *where, const char *what)

Druckt die Meldung what zusammen mit dem Speicherort where, dem Namen der Quelldatei und der Zeilennummer, wenn test false ist.

Q_ASSERT_X ist nützlich, um Vor- und Nachbedingungen während der Entwicklung zu testen. Es tut nichts, wenn QT_NO_DEBUG während der Kompilierung definiert wurde.

Beispiel:

// File: div.cpp

#include <QtGlobal>

int divide(int a, int b)
{
    Q_ASSERT_X(b != 0, "divide", "division by zero");
    return a / b;
}

Wenn b gleich Null ist, gibt das Q_ASSERT_X-Statement die folgende Meldung unter Verwendung der Funktion qFatal() aus:

ASSERT failure in divide: "division by zero", file div.cpp, line 7

Siehe auch Q_ASSERT(), qFatal(), und Debugging-Techniken.

void Q_CHECK_PTR(void *pointer)

Wenn pointer gleich nullptr ist, wird eine Meldung mit dem Dateinamen und der Zeilennummer des Quellcodes ausgegeben, die besagt, dass dem Programm der Speicher ausgegangen ist, und die Programmausführung abgebrochen. Es wirft stattdessen std::bad_alloc, wenn Ausnahmen aktiviert sind.

Q_CHECK_PTR bewirkt nichts, wenn QT_NO_DEBUG und QT_NO_EXCEPTIONS während der Kompilierung definiert wurden. Daher dürfen Sie Q_CHECK_PTR nicht verwenden, um erfolgreiche Speicherzuweisungen zu prüfen, da die Prüfung in einigen Fällen deaktiviert wird.

Beispiel:

int *a;

Q_CHECK_PTR(a = new int[80]);   // WRONG!

a = new (nothrow) int[80];      // Right
Q_CHECK_PTR(a);

Siehe auch qWarning() und Debugging-Techniken.

void Q_UNREACHABLE

Sagt dem Compiler, dass der aktuelle Punkt von keiner Ausführung erreicht werden kann, so dass er alle Codepfade, die hierher führen, als toten Code optimieren kann, ebenso wie den Code, der von hier aus weitergeht.

Dieses Makro ist nützlich, um unmögliche Bedingungen zu markieren. Nehmen wir zum Beispiel die folgende Aufzählung:

   enum Shapes {
       Rectangle,
       Triangle,
       Circle,
       NumShapes
   };

Man kann eine Schaltertabelle wie folgt schreiben:

   switch (shape) {
       case Rectangle:
           return rectangle();
       case Triangle:
           return triangle();
       case Circle:
           return circle();
       case NumShapes:
           Q_UNREACHABLE();
           break;
   }

Der Vorteil des Einfügens von Q_UNREACHABLE() an dieser Stelle ist, dass der Compiler angewiesen wird, keinen Code für eine Shape-Variable mit diesem Wert zu erzeugen. Wenn das Makro fehlt, wird der Compiler trotzdem die notwendigen Vergleiche für diesen Wert erzeugen. Würde das Case-Label entfernt, könnten einige Compiler eine Warnung ausgeben, dass einige Enum-Werte nicht geprüft wurden.

Durch die Verwendung dieses Makros in unmöglichen Bedingungen kann die Codeabdeckung verbessert werden, da tote Codepfade eliminiert werden können.

In Debug-Builds wird die Bedingung durch einen Assert erzwungen, um die Fehlersuche zu erleichtern.

Hinweis: Verwenden Sie das Makro Q_UNREACHABLE_RETURN(), um Return-Anweisungen für Compiler einzufügen, die sie benötigen, ohne Warnungen für Compiler zu verursachen, die sich über ihr Vorhandensein beschweren.

Siehe auch Q_ASSERT(), qFatal(), und Q_UNREACHABLE_RETURN().

[since 6.5] void Q_UNREACHABLE_RETURN(...)

Dies ist gleichbedeutend mit

Q_UNREACHABLE();
return __VA_ARGS__;

mit der Ausnahme, dass es die Rückgabe bei Compilern, die davor warnen würden, auslässt.

Dieses Makro wurde in Qt 6.5 eingeführt.

Siehe auch Q_UNREACHABLE().

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.