assert
makro, , _assert
_wassert
Wertet einen Ausdruck aus, gibt eine Diagnosemeldung aus und bricht das Programm ab, wenn das Ergebnis false
ist.
Syntax
assert(
expression
);
void _assert(
char const* message,
char const* filename,
unsigned line
);
void _wassert(
wchar_t const* message,
wchar_t const* filename,
unsigned line
);
Parameter
expression
Ein skalarer Ausdruck (einschließlich Zeigerausdrücken) der zu ungleich null (true
) oder „0“ (false
) ausgewertet wird.
message
Die angezeigte Meldung.
filename
Der Name der Quelldatei, in der der Assertionsfehler aufgetreten ist.
line
Die Zeilennummer in der Quelldatei mit dem Assertionsfehler.
Hinweise
Das assert
-Makro wird normalerweise verwendet, um Logikfehler während der Programmentwicklung zu erkennen. Verwenden Sie es, um die Programmausführung zu beenden, wenn unerwartete Bedingungen eintreten, indem Sie das expression
-Argument so implementieren, dass es nur dann als false
ausgewertet wird, wenn das Programm nicht ordnungsgemäß arbeitet. Assertionsprüfungen können zur Kompilierzeit durch Definition des Makros NDEBUG
deaktiviert werden. Sie können das Makro deaktivieren, ohne die assert
Quelldateien mithilfe einer /DNDEBUG
Befehlszeilenoption zu ändern. Sie können das assert
Makro im Quellcode deaktivieren, indem Sie eine #define NDEBUG
Direktive verwenden, bevor <assert.h>
sie eingeschlossen wird.
Das assert
Makro druckt eine Diagnosenachricht, wenn expression
sie als (0) ausgewertet false
wird, und Aufrufe abort
zum Beenden der Programmausführung. Es wird keine Aktion ausgeführt, wenn expression
true
(ungleich null) ist. Die Diagnosemeldung enthält den Ausdruck, für den der Fehler aufgetreten ist, den Namen der Quelldatei und die Nummer der Zeile, in der der Assertionsfehler aufgetreten ist.
Die Diagnosenachricht wird in breiten (wchar_t
) Zeichen gedruckt. Daher funktioniert es wie erwartet, auch wenn unicode-Zeichen im Ausdruck vorhanden sind.
Das Ziel der Diagnosemeldung hängt vom Typ der Anwendung ab, die die Routine aufgerufen hat. Konsolenanwendungen empfangen die Nachricht über stderr
. Ruft in einer Windows-basierten Anwendung die Windows-Funktion auf, um ein Meldungsfeld zu erstellen, assert
um die Nachricht mit drei Schaltflächen anzuzeigen: Abbrechen, Wiederholen und Ignorieren.MessageBox
Wenn der Benutzer "Abbrechen" auswäht, wird das Programm sofort abgebrochen. Wenn der Benutzer "Wiederholen" auswähnt, wird der Debugger aufgerufen, und der Benutzer kann das Programm debuggen, wenn das JiT-Debuggen (Just-in-Time) aktiviert ist. Wenn der Benutzer "Ignorieren" auswäht, wird das Programm mit der normalen Ausführung fortgesetzt. Das Klicken auf "Ignorieren", wenn eine Fehlerbedingung vorhanden ist, kann zu einem nicht definierten Verhalten führen, da die Vorbedingungen des aufrufenden Codes nicht erfüllt wurden.
Um das Standardausgabeverhalten unabhängig vom App-Typ außer Kraft zu setzen, rufen Sie _set_error_mode
die Auswahl zwischen dem Ausgabe-zu-Stderr- und dem Anzeigedialogfeldverhalten auf.
Nach assert
dem Anzeigen der zugehörigen Meldung wird ein Dialogfeld mit den Schaltflächen "Abbrechen", "Wiederholen" und "Ignorieren" angezeigtabort
. abort
beendet das Programm, sodass die Schaltfläche "Wiederholen " und "Ignorieren " nach dem assert
Aufruf die Programmausführung nicht fortsetzen. Wenn assert
ein Dialogfeld angezeigt wird, wird das abort
Dialogfeld nicht angezeigt. Das Dialogfeld wird nur abort
angezeigt, wenn assert
die Ausgabe an stderr gesendet wird.
Als Folge des oben genannten Verhaltens wird ein Dialogfeld immer nach einem assert
Aufruf im Debugmodus angezeigt. Das Verhalten jeder Schaltfläche wird in der folgenden Tabelle erfasst.
Fehlermodus | Ausgabe an stderr (Konsole/_OUT_TO_STDERR ) |
Dialogfeld anzeigen (Windows/_OUT_TO_MSGBOX ) |
---|---|---|
Abort |
Sofortiges Beenden mit Ausgangscode 3 | Sofortiges Beenden mit Ausgangscode 3 |
Retry |
Unterbrechen des Debuggers während der Ausführung abort |
Unterbrechen des Debuggers während der Ausführung assert |
Ignore |
Beenden über abort |
Programm fortsetzen, als ob assert es nicht ausgelöst wurde (kann zu einem nicht definierten Verhalten führen, da die Voraussetzungen des aufrufenden Codes nicht erfüllt wurden) |
Weitere Informationen zum CRT-Debugging finden Sie unter CRT-Debuggingtechniken.
Die Funktionen _assert
und _wassert
sind interne CRT-Funktionen. Sie helfen dabei, den für die Unterstützung von Assertion in Ihren Objektdateien erforderlichen Code zu minimieren. Es wird nicht empfohlen, diese Funktionen direkt aufzurufen.
Das assert
Makro ist sowohl in der Version als auch in Debugversionen der C-Laufzeitbibliotheken aktiviert, wenn NDEBUG
es nicht definiert ist. Wenn NDEBUG
sie definiert ist, ist das Makro verfügbar, wertet das Argument jedoch nicht aus und hat keine Auswirkung. Wenn sie aktiviert ist, ruft das assert
Makro die Implementierung auf _wassert
. Andere Assertionsmakros , und _ASSERT_EXPR
, sind auch verfügbar, aber sie bewerten nur die Ausdrücke, die an sie übergeben werden, wenn das _DEBUG
Makro definiert wurde und wenn sie in Code enthalten sind, _ASSERT
_ASSERTE
der mit der Debugversion der C-Laufzeitbibliotheken verknüpft ist.
Anforderungen
Routine | Erforderlicher Header |
---|---|
assert , _wassert |
<assert.h> |
Die Signatur der _assert
Funktion ist in einer Headerdatei nicht verfügbar. Die Signatur der _wassert
Funktion ist nur verfügbar, wenn das NDEBUG
Makro nicht definiert ist.
Beispiel
In diesem Programm verwendet die analyze_string
-Funktion das assert
-Makro, um verschiedene Bedingungen im Zusammenhang mit der Zeichenfolge und ihrer Länge zu prüfen. Wenn bei einer der Bedingungen ein Fehler auftritt, gibt das Programm eine Meldung aus, die auf die Ursache des Fehlers hinweist.
// crt_assert.c
// compile by using: cl /W4 crt_assert.c
#include <stdio.h>
#include <assert.h>
#include <string.h>
void analyze_string( char *string ); // Prototype
int main( void )
{
char test1[] = "abc", *test2 = NULL, test3[] = "";
printf ( "Analyzing string '%s'\n", test1 ); fflush( stdout );
analyze_string( test1 );
printf ( "Analyzing string '%s'\n", test2 ); fflush( stdout );
analyze_string( test2 );
printf ( "Analyzing string '%s'\n", test3 ); fflush( stdout );
analyze_string( test3 );
}
// Tests a string to see if it is NULL,
// empty, or longer than 0 characters.
void analyze_string( char * string )
{
assert( string != NULL ); // Cannot be NULL
assert( *string != '\0' ); // Cannot be empty
assert( strlen( string ) > 2 ); // Length must exceed 2
}
Das Programm erzeugt diese Ausgabe:
Analyzing string 'abc'
Analyzing string '(null)'
Assertion failed: string != NULL, file crt_assert.c, line 25
Nachdem der Assertionsfehler abhängig von der Version des Betriebssystems und der Laufzeitbibliothek erfolgt, wird möglicherweise ein Meldungsfeld angezeigt, das etwas ähnliches enthält:
A problem caused the program to stop working correctly. Windows will close the program and notify you if a solution is available.
Wenn ein Debugger installiert ist, wählen Sie die Schaltfläche Debug aus, um den Debugger zu starten, oder Programm schließen zum Beenden.
Siehe auch
Fehlerbehandlung
Prozess- und Umgebungskontrolle
abort
raise
signal
_ASSERT
, Makros _ASSERTE
_ASSERT_EXPR
_DEBUG