Freigeben über


_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 _CrtDbgReportWauf, was die Ausgabe der Ausgabewerte in Breitzeichen bewirkt. _ASSERTE gibt Unicode-Zeichen in booleanExpression ordnungsgemäß aus, und _ASSERT_EXPR gibt Unicode-Zeichen in messageaus.

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 _ASSERTEerfolgen, 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 _CrtDbgReportFunktion , _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 _RPTDebugmakros _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_EXPRMakros 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 == string2zu 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
assertMakro, , _assert_wassert
_RPT, , _RPTF_RPTW, _RPTFW Makros