_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