Freigeben über


assertmakro, , _assert_wassert

Wertet einen Ausdruck aus, gibt eine Diagnosemeldung aus und bricht das Programm ab, wenn das Ergebnis falseist.

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 NDEBUGdeaktiviert 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 expressiontrue (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