Freigeben über


_ASSERT- und _ASSERTE-Makros

Werten Sie einen Ausdruck aus und generieren Sie ein Debugbericht, wenn das Ergebnis False (nur Debugversion) ist.

_ASSERT( 
   booleanExpression 
);
_ASSERTE( 
   booleanExpression 
);

Parameter

  • booleanExpression
    Ausdruck (einschließlich Zeiger) bis der Wert ungleich 0 (null) oder 0 ergibt.

Hinweise

Die _ASSERT und _ASSERTE bereitgestellten Makros eine Anwendung mit einem bereinigten und einfachen Mechanismus zum Überprüfen von Annahmen während des Debuggingsprozesses. Sie sind sehr flexibel, da sie nicht erforderlich ist, in #ifdef-Anweisungen eingeschlossen werden, um sie in einem Releasebuild einer Anwendung aufgerufen werden. Diese Flexibilität wird erreicht, indem das _DEBUG-Makro verwendet. _ASSERT und _ASSERTE sind nur verfügbar, wenn _DEBUG definiert wird. Ist _DEBUG nicht definiert wird, werden Aufrufe dieser Makros während des Präprozessorlaufs entfernt.

_ASSERT und _ASSERTE werden der booleanExpression-Argument aus und das Ergebnis von false (0) ist, drucken sie eine Diagnosemeldung und rufen _CrtDbgReportW auf, um ein Debugbericht zu generieren. Das _ASSERT-Makro gibt eine einfache Diagnosemeldung, während _ASSERTE eine Zeichenfolgendarstellung des fehlerhaften Ausdrucks in der Meldung enthält. Diese Makros bleiben wirkungslos, solange booleanExpression mit dem Wert ungleich 0 (null) ergibt.

_ASSERT_ASSERTE und _CrtDbgReportW aufrufen, der die gesamte Ausgabe wird, in den Breitzeichen sein, und _ASSERTE gibt ordnungsgemäß Unicode-Zeichen in booleanExpression.

Da das _ASSERTE-Makro den fehlgeschlagenen Ausdruck im generierten Bericht angibt, können es Benutzer, um das Problem zu identifizieren, ohne den Anwendungsquellcode zuzugreifen. ist jedoch ein Nachteil darin, dass jeder Ausdruck, der von _ASSERTE ausgewertet wird, in der Ausgabe (Debugversion) der Anwendung als Zeichenfolgenkonstante enthalten ist. Wenn _ASSERTE viele Aufrufe gemacht werden, können diese Ausdrücke die Größe der Ausgabedatei groß erhöhen.

Sofern, dass Sie nicht mit den unter _CrtSetReportMode und _CrtSetReportFile-Funktionen angeben, werden Meldungen in einer Popupdialogfeldentsprechung zum Festlegen:

_CrtSetReportMode(CRT_ASSERT, _CRTDBG_MODE_WNDW);

_CrtDbgReport oder _CrtDbgReportW generiert den Debugbericht und bestimmt sein, Ziel oder Ziele, auf Grundlage des aktuellen Berichtsmodus oder Modi und die Datei, die für den Bericht _CRT_ASSERT definiert werden, geben ein. Standardmäßig werden Assertionsfehler und Fehler auf ein debuggensmeldungsfenster verwiesen. Die Funktionen _CrtSetReportMode und _CrtSetReportFile werden verwendet, um die Ziele für jeden Berichtstyp zu definieren.

Wenn das Ziel ein debuggensmeldungsfenster ist und der Benutzer auf die Schaltfläche klickt Wiederholen, gibt _CrtDbgReport_CrtDbgReportW oder 1 zurück und bewirkt die Makros _ASSERT und _ASSERTE, den Debugger starten, vorausgesetzt, dass ein Just-In-Time (JIT)- - Debuggen aktiviert ist.

Weitere Informationen zum Berichterstellungsprozess, finden Sie die Funktion _CrtDbgReport, _CrtDbgReportW. Weitere Informationen zum Auflösen von Assertionsfehlern und Verwenden dieser Makros als Debuggingsfehlerbehandlungsmechanismus, finden Sie unter Verwenden von Makros für Überprüfungen und Berichterstellung.

_RPT, _RPTF debuggen Makros sind auch verfügbar zum Generieren eines Debugberichts, jedoch werden keinen Ausdruck aus. Die Makros _RPT generieren einen einfachen Bericht. Die _RPTF-Makros enthalten die Quelldatei und die Zeilennummer, in der das Berichtsmakro im generierten Bericht aufgerufen wurde. Neben den _ASSERTE-Makros kann die Routine der ANSI Assertion verwendet werden, um sicherzustellen Programmlogik. Diese Routine ist sowohl in der Debug- als auch in Releaseversionen der Bibliotheken verfügbar. Breitzeichenversionen dieser Makros sind verfügbar (_RPTWn, _RPTFWn). Die Breitzeichenversionen entsprechen den schmalen Zeichenversionen identisch, nur dass Zeichenfolgen mit Breitzeichen werden für alle Zeichenfolgenparameter verwendet und ausgegeben.

Obwohl _ASSERT und _ASSERTE sind Makros und erhalten werden, indem sie Crtdbg.h enthalten, muss die Anwendung mit einer der folgenden Bibliotheken verknüpfen, da diese Makros andere Laufzeitfunktionen aufrufen.

  • Libcmtd.lib
    Mehrgängige von statische Bibliothek, Debugversion.

  • Msvcrtd.lib
    Importbibliothek für Msvcr90d.dll, Debugversion.

Anforderungen

Makro

Erforderlicher Header

_ASSERT

<crtdbg.h>

_ASSERTE

<crtdbg.h>

Beispiel

In diesem Programm werden Aufrufe der _ASSERT und _ASSERTE gemacht Makros, um die Bedingung string1 == string2 zu testen. Wenn die Bedingung fehlschlägt, drucken diese Makros eine Diagnosemeldung. Die _RPTn und _RPTFn Gruppe wird von Makros auch in diesem Programm, als Alternative zur printf-Funktion ausgeführt.

// 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;
}
  

.NET Framework-Entsprechung

System::Diagnostics::Debug::Assert

Siehe auch

Referenz

Debugroutinen

_RPT-, _RPTF-, _RPTW- und _RPTFW-Makros