_ASSERT
, Makros _ASSERTE
_ASSERT_EXPR
Wertet einen Ausdruck aus und erzeugt einen Debugbericht, wenn das Ergebnis false
lautet (nur Debugversion).
Syntax
// Typical usage:
_ASSERT_EXPR( booleanExpression, message );
_ASSERT( booleanExpression );
_ASSERTE( booleanExpression );
Parameter
booleanExpression
Ein skalarer Ausdruck (einschließlich Zeigerausdrücken) der zu ungleich null (true
) oder „0“ (false
) ausgewertet wird.
message
Eine Breitzeichenfolge, die als Teil des Berichts angezeigt werden soll.
Hinweise
Die Makros _ASSERT_EXPR
, _ASSERT
und _ASSERTE
stellen Anwendungen einen sauberen und einfachen Mechanismus für die Überprüfung von Annahmen während des Debugvorgangs zur Verfügung. Sie sind flexibel, da sie nicht in #ifdef
Anweisungen eingeschlossen werden müssen, um zu verhindern, dass sie in einem Einzelhandelsbuild einer Anwendung aufgerufen werden. Diese Flexibilität wird mithilfe des _DEBUG
Makros erreicht. _ASSERT_EXPR
, _ASSERT
und _ASSERTE
sind nur verfügbar, wenn _DEBUG
zur Kompilierzeit definiert ist. Wenn _DEBUG
sie nicht definiert ist, werden Aufrufe dieser Makros während der Vorverarbeitung entfernt.
_ASSERT_EXPR
_ASSERT
aus, und bewerten Sie _ASSERTE
ihr booleanExpression
Argument und wenn das Ergebnis (0) lautet false
, drucken sie eine Diagnosenachricht und rufen sie auf_CrtDbgReportW
, um einen Debugbericht zu generieren. Das _ASSERT
Makro druckt eine einfache Diagnosenachricht, _ASSERTE
enthält eine Zeichenfolgendarstellung des fehlgeschlagenen Ausdrucks in der Nachricht und _ASSERT_EXPR
enthält die message
Zeichenfolge in der Diagnosenachricht. Diese Makros führen keine Aktion aus, wenn booleanExpression
zu einem anderen Wert als null ausgewertet wird.
_ASSERT_EXPR
, _ASSERT
und _ASSERTE
rufen _CrtDbgReportW
auf, was die Ausgabe der Ausgabewerte in Breitzeichen bewirkt. _ASSERTE
gibt Unicode-Zeichen in booleanExpression
ordnungsgemäß aus, und _ASSERT_EXPR
gibt Unicode-Zeichen in message
aus.
Da das _ASSERTE
-Makro den Fehlerausdruck angibt und _ASSERT_EXPR
das Angeben einer Nachricht im erstellten Bericht ermöglicht, können Benutzer mit ihrer Hilfe das Problem identifizieren, ohne auf den Quellcode der Anwendung zurückgreifen zu müssen. Es besteht jedoch insofern ein Nachteil, als dass jede von message
ausgegebene _ASSERT_EXPR
und jeder von _ASSERTE
ausgewertete Ausdruck als Zeichenfolgenkonstante in die Ausgabedatei (Debugversion) Ihrer Anwendung aufgenommen wird. Wenn daher viele Aufrufe von _ASSERT_EXPR
oder _ASSERTE
erfolgen, können diese Ausdrücke die Größe ihrer Ausgabedatei stark anwachsen lassen.
Sofern Sie nichts anderes mit den _CrtSetReportMode
Funktionen _CrtSetReportFile
angeben, werden Nachrichten in einem Popupdialogfeld angezeigt, das der Einstellung entspricht:
_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_WNDW);
_CrtDbgReportW
generiert den Debugbericht und bestimmt sein Ziel oder seine Ziele, basierend auf dem aktuellen Berichtsmodus oder den aktuellen Berichtsmodi und der für den _CRT_ASSERT
-Berichtstyp definierten Datei. Standardmäßig werden Assertionsfehler und Fehler an ein Debugmeldungsfenster geleitet. Die _CrtSetReportMode
Und _CrtSetReportFile
Funktionen werden verwendet, um die Ziele für jeden Berichtstyp zu definieren.
Wenn das Ziel ein Debugmeldungsfenster ist und der Benutzer die Schaltfläche "Wiederholen" auswählt, _CrtDbgReportW
gibt "1" zurück, wodurch die _ASSERT_EXPR
_ASSERT
_ASSERTE
Makros den Debugger starten, wenn das JiT-Debuggen (Just-in-Time) aktiviert ist.
Weitere Informationen zum Berichterstellungsprozess finden Sie in der _CrtDbgReport
Funktion , _CrtDbgReportW
Weitere Informationen zum Beheben von Assertionsfehlern und zur Verwendung dieser Makros als Debugfehlerbehandlungsmechanismus finden Sie unter Makros für die Berichterstellung.
Zusätzlich zu den _ASSERT
Makros kann das assert
Makro verwendet werden, um die Programmlogik zu überprüfen. Dieses Makro steht sowohl in der Debug- als auch in der endgültigen Version der Bibliotheken zur Verfügung. Die _RPT
Debugmakros _RPTF
sind auch zum Generieren eines Debugberichts verfügbar, aber sie werten keinen Ausdruck aus. Die _RPT
-Makros erstellen einen einfachen Bericht. Die _RPTF
-Makros schließen die Quelldatei und die Zeilennummer, in der das Berichtsmakro aufgerufen wurde, in den generierten Bericht ein. Breitzeichenversionen dieser Makros sind verfügbar (_RPTW
, _RPTFW
). Die Breitzeichenversionen sind mit den Versionen mit schmalen Zeichen identisch, mit dem Unterschied, dass für alle Zeichenfolgenparameter und Ausgaben Breitzeichen-Zeichenfolgen verwendet werden.
_ASSERT
Obwohl _ASSERT_EXPR
Makros und Makros verfügbar sind und _ASSERTE
durch Einschließen <crtdbg.h>
verfügbar sind, muss die Anwendung eine Verknüpfung mit einer Debugversion der C-Laufzeitbibliothek herstellen, wenn _DEBUG
diese Makros andere Laufzeitfunktionen aufrufen.
Anforderungen
Makro | Erforderlicher Header |
---|---|
_ASSERT_EXPR , _ASSERT _ASSERTE |
<crtdbg.h> |
Beispiel
In diesem Programm werden Aufrufe der Makros _ASSERT
und _ASSERTE
vorgenommen, um die Bedingung string1 == string2
zu testen. Wenn bei der Bedingung ein Fehler auftritt, geben diese Makros eine Diagnosemeldung aus. Die Makrogruppe _RPT
und _RPTF
wird in diesem Programm ebenfalls ausgeführt, als Alternative zur Funktion printf
.
// crt_ASSERT_macro.c
// compile with: /D_DEBUG /MTd /Od /Zi /link /verbose:lib /debug
//
// This program uses the _ASSERT and _ASSERTE debugging macros.
//
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <crtdbg.h>
int main()
{
char *p1, *p2;
// The Reporting Mode and File must be specified
// before generating a debug report via an assert
// or report macro.
// This program sends all report types to STDOUT.
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT);
_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDOUT);
_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDOUT);
// Allocate and assign the pointer variables.
p1 = (char *)malloc(10);
strcpy_s(p1, 10, "I am p1");
p2 = (char *)malloc(10);
strcpy_s(p2, 10, "I am p2");
// Use the report macros as a debugging
// warning mechanism, similar to printf.
// Use the assert macros to check if the
// p1 and p2 variables are equivalent.
// If the expression fails, _ASSERTE will
// include a string representation of the
// failed expression in the report.
// _ASSERT does not include the
// expression in the generated report.
_RPT0(_CRT_WARN,
"Use the assert macros to evaluate the expression p1 == p2.\n");
_RPTF2(_CRT_WARN, "\n Will _ASSERT find '%s' == '%s' ?\n", p1, p2);
_ASSERT(p1 == p2);
_RPTF2(_CRT_WARN, "\n\n Will _ASSERTE find '%s' == '%s' ?\n",
p1, p2);
_ASSERTE(p1 == p2);
_RPT2(_CRT_ERROR, "'%s' != '%s'\n", p1, p2);
free(p2);
free(p1);
return 0;
}
Use the assert macros to evaluate the expression p1 == p2.
crt_ASSERT_macro.c(54) :
Will _ASSERT find 'I am p1' == 'I am p2' ?
crt_ASSERT_macro.c(55) : Assertion failed!
crt_ASSERT_macro.c(58) :
Will _ASSERTE find 'I am p1' == 'I am p2' ?
crt_ASSERT_macro.c(59) : Assertion failed: p1 == p2
'I am p1' != 'I am p2'
Siehe auch
Debugroutinen
assert
Makro, , _assert
_wassert
_RPT
, , _RPTF
_RPTW
, _RPTFW
Makros