<QtAssert>

Makros zur Überprüfung von Bedingungen während der Entwicklung und Fehlersuche. Mehr...

Header: #include <QtAssert>

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)
(since 6.11) void Q_PRESUME(bool expr)
void Q_UNREACHABLE()
(since 6.5) void Q_UNREACHABLE_RETURN(...)

Ausführliche Beschreibung

Funktionsdokumentation

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

Verwendet Q_CHECK_PTR auf p und gibt anschließend p zurück.

Dies kann als Inline-Version von ` Q_CHECK_PTR` verwendet werden.

Makro-Dokumentation

void Q_ASSERT(bool test)

Gibt eine Warnmeldung aus, die den Namen der Quellcode-Datei und die Zeilennummer enthält, sofern „ test “ auf „ false “ gesetzt ist.

Q_ASSERT() ist nützlich, um Vor- und Nachbedingungen während der Entwicklung zu testen. Es führt keine Aktion aus, wenn „ QT_NO_DEBUG “ bei 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 ` den Wert Null hat, gibt die `Q_ASSERT`-Anweisung mithilfe der Funktion ` qFatal()` die folgende Meldung 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)

Gibt die Meldung „ what “ zusammen mit dem Ort „ where “, dem Namen der Quelldatei und der Zeilennummer aus, sofern „ test “ auf „ false “ gesetzt ist.

Q_ASSERT_X ist nützlich, um während der Entwicklung Vor- und Nachbedingungen zu testen. Es führt keine Aktion aus, wenn „ QT_NO_DEBUG “ bei 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 “ Null ist, gibt die Anweisung „Q_ASSERT_X“ mithilfe der Funktion „ qFatal()“ die folgende Meldung 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 “ auf „ nullptr “ gesetzt ist, wird eine Meldung ausgegeben, die den Dateinamen und die Zeilennummer des Quellcodes enthält und darauf hinweist, dass dem Programm der Speicher ausgegangen ist, woraufhin die Programmausführung abgebrochen wird. Sind Ausnahmen aktiviert, wird stattdessen eine „ std::bad_alloc “-Ausnahme ausgelöst.

Q_CHECK_PTR führt keine Aktion aus, wenn QT_NO_DEBUG und QT_NO_EXCEPTIONS bei der Kompilierung definiert wurden. Daher dürfen Sie Q_CHECK_PTR nicht zur Überprüfung erfolgreicher Speicherzuweisungen verwenden, da die Überprüfung in einigen Fällen deaktiviert ist.

Beispiel:

int *a;

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

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

Siehe auch „ qWarning()“ und „Debugging-Techniken“.

[since 6.11] void Q_PRESUME(bool expr)

Bewirkt, dass der Compiler davon ausgeht, dass „ expr “ gleichbedeutend mit „ true “ ist.

Dieses Makro generiert ` Q_ASSERT()` und ein Attribut im C++23-Stil ` [[assume]] `, sofern dies vom Compiler unterstützt wird. Andernfalls wird auf ` Q_ASSERT()` zurückgegriffen.

Dieses Makro wurde in Qt 6.11 eingeführt.

Siehe auch „ Q_ASSERT()“, „ Q_UNREACHABLE()“, „ Q_LIKELY()“ und „ Q_ASSUME()“.

void Q_UNREACHABLE()

Teilt dem Compiler mit, dass der aktuelle Punkt durch keine Ausführung erreicht werden kann, sodass er alle hierhin führenden Codepfade sowie den von hier aus weiterführenden Code als „Dead Code“ optimieren kann.

Dieses Makro ist nützlich, um unmögliche Bedingungen zu kennzeichnen. Beispielsweise bei folgender Enumeration:

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

kann man eine Switch-Tabelle 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 besteht darin, dass dem Compiler mitgeteilt wird, keinen Code für eine `shape`-Variable zu generieren, die diesen Wert enthält. Fehlt das Makro, generiert der Compiler dennoch die erforderlichen Vergleiche für diesen Wert. Würde das „case“-Label entfernt, könnten manche Compiler eine Warnung ausgeben, dass einige Enum-Werte nicht geprüft wurden.

Durch die Verwendung dieses Makros in unmöglichen Bedingungen lässt sich die Codeabdeckung verbessern, da tote Codepfade eliminiert werden können.

In Debug-Builds wird die Bedingung durch ein „assert“ erzwungen, um das Debuggen zu erleichtern.

Hinweis: Verwenden Sie das Makro „ Q_UNREACHABLE_RETURN()“, um „return“-Anweisungen für Compiler einzufügen, die diese benötigen, ohne dabei Warnungen bei Compilern auszulösen, die dessen Vorhandensein bemängeln.

Siehe auch „ Q_ASSERT()“, „ qFatal()“, „ Q_UNREACHABLE_RETURN()“ und „ Q_PRESUME()“.

[since 6.5] void Q_UNREACHABLE_RETURN(...)

Dies entspricht

Q_UNREACHABLE();
return __VA_ARGS__;

, außer dass bei Compilern, die diesbezüglich eine Warnung ausgeben würden, die Rückgabe weggelassen wird.

Dieses Makro wurde in Qt 6.5 eingeführt.

Siehe auch Q_UNREACHABLE() und Q_PRESUME().

© 2026 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.