Condividi tramite


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

Vedere anche

Riferimenti

Routine di debug

_RPT, _RPTF, _RPTW, _RPTFW Macros