Macro _ASSERT, _ASSERTE
Valutare un'espressione e generare un report di debug quando il risultato è False (solo versione di debug).
_ASSERT(
booleanExpression
);
_ASSERTE(
booleanExpression
);
Parametri
- booleanExpression
Espressione (comprendente i puntatori) che restituisce un valore diverso da zero oppure 0.
Note
Le macro _ASSERTE e _ASSERT forniscono un'applicazione con un sistema pulito e semplice per controllare i presupposti durante il processo di debug. Sono molto flessibili perché non devono essere racchiuse in istruzioni #ifdef per evitare che vengano chiamate in una build finale di un'applicazione. Questa flessibilità viene raggiunta utilizzando la macro _DEBUG. _ASSERT e _ASSERTE sono disponibili solo quando _DEBUG è definito. Quando _DEBUG non viene definito, le chiamate a queste macro vengono rimosse durante la pre-elaborazione.
_ASSERT e _ASSERTE valutano il loro argomento booleanExpression e quando il risultato è false (0), stampano un messaggio di diagnostica e chiamano _CrtDbgReportW per generare un report di debug. La macro _ASSERT stampa un messaggio di diagnostica semplice, mentre _ASSERTE include una rappresentazione di stringa dell'espressione non riuscita nel messaggio. Queste macro non eseguono alcuna operazione quando booleanExpression restituisce un valore diverso da zero.
_ASSERT e _ASSERTE invocano _CrtDbgReportW , che fa si che tutto l'output sia in caratteri estesi e _ASSERTE stampi correttamente i caratteri unicode in booleanExpression.
Poiché la macro _ASSERTE specifica l'espressione non riuscita nel report generato, consente di identificare il problema senza fare riferimento al codice sorgente dell'applicazione. Tuttavia, uno svantaggio è presente in quanto ogni espressione valutata da _ASSERTE è inclusa nel file di output (versione di debug) dell'applicazione come una costante di stringa. Pertanto, se un elevato numero di chiamate vengono fatte a _ASSERTE, queste espressioni possono aumentare notevolmente la dimensione del file di output.
Se non diversamente specificato con le funzioni _CrtSetReportFile e _CrtSetReportMode, i messaggi vengono visualizzati in un equivalente popup della finestra di dialogo per impostare:
_CrtSetReportMode(CRT_ASSERT, _CRTDBG_MODE_WNDW);
_CrtDbgReport o _CrtDbgReportW generano il report di debug e ne determinano la destinazione o destinazioni, in base alla modalità Report o le modalità e il file definito per il tipo di rapporto _CRT_ASSERT. Per impostazione predefinita, gli errori di asserzione e gli errori vengono indirizzati a una finestra di messaggio di debug. Le funzioni di _CrtSetReportFile e di _CrtSetReportMode vengono utilizzate per definire le destinazioni per ogni tipo di rapporto.
Quando la destinazione è una finestra di messaggio di debug e l'utente sceglie il pulsante Riprova, _CrtDbgReport o _CrtDbgReportW restituiscono 1, inducendo le macro _ASSERT e _ASSERTE ad avviare il debugger fornito il cui debug just-in-time (JIT) è abilitato.
Per ulteriori informazioni sul processo di creazione di rapporti, vedere la funzione _CrtDbgReport, _CrtDbgReportW. Per ulteriori informazioni sugli errori di asserzione e sull'utilizzo di queste macro come meccanismo di gestione degli errori del debug, vedere Utilizzando le macro per la verifica e la creazione di rapporti.
Le macro di debug di _RPT, _RPTF sono inoltre disponibili per la generazione di report di debug, ma non valuta un'espressione. Le macro _RPT genera un rapporto semplice. Le macro _RPTF includono il file di origine e il numero di riga in cui la macro rapporto è stata chiamata nel report generato. Oltre alle macro _ASSERTE, la routine assert ANSI può essere utilizzata per verificare la logica di programma. Questa procedura è disponibile nelle versioni di debug delle librerie. Le versioni di carattere esteso di queste macro sono disponibili (_RPTWn, _RPTFWn). Le versioni di carattere esteso sono identiche alle versioni sul carattere tranne che nelle stringhe di caratteri estesi che vengono utilizzate per tutti i parametri di stringa e l'output.
Sebbene _ASSERT e _ASSERTE siano macro e vengano ottenute includendo Crtdbg.h, l'applicazione deve collegarsi a una delle librerie di debug seguenti perché queste macro chiamano altre funzioni di runtime.
Libcmtd.lib
Libreria statica multithreading, versione di debug.Msvcrtd.lib
Libreria di importazione per Msvcr90d.dll, versione di debug.
Requisiti
Macro |
Intestazione obbligatoria |
---|---|
_ASSERT |
<crtdbg.h> |
_ASSERTE |
<crtdbg.h> |
Esempio
In questo programma, le chiamate vengono apportate alle macro _ASSERTE e _ASSERT per verificare la condizione string1 == string2. Se la condizione fallisce, queste macro stampano un messaggio diagnostico. Il gruppo di _RPTFn e di _RPTn di macro viene utilizzato in questo programma, come alternativa alla funzione di 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;
}
Equivalente .NET Framework
System::Diagnostics::Debug::Assert