assert macro, _assert, _wassert

Valuta un'espressione e, quando il risultato è false, stampa un messaggio di diagnostica e arresta il programma.

Sintassi

assert(
   expression
);
void _assert(
   char const* message,
   char const* filename,
   unsigned line
);
void _wassert(
   wchar_t const* message,
   wchar_t const* filename,
   unsigned line
);

Parametri

expression
Espressione scalare (incluse le espressioni puntatore) che restituisce un valore diverso da zero (true) oppure 0 (false).

message
Messaggio da visualizzare.

filename
Nome del file di origine in cui l'asserzione non è riuscita.

line
Numero di riga nel file di origine dell'asserzione non riuscita.

Osservazioni:

La assert viene in genere usata per identificare gli errori di logica durante lo sviluppo di programmi. Può essere usata per arrestare l'esecuzione del programma quando si verificano condizioni impreviste implementando l'argomento expression in modo che restituisca false solo quando il programma funziona in modo non corretto. I controlli delle asserzioni possono essere disattivati in fase di compilazione definendo la macro NDEBUG. È possibile disattivare la assert macro senza modificare i file di origine usando un'opzione /DNDEBUG della riga di comando. È possibile disattivare la assert macro nel codice sorgente usando una #define NDEBUG direttiva prima <assert.h> di essere inclusa.

La assert macro stampa un messaggio di diagnostica quando expression restituisce false (0) e chiama abort per arrestare l'esecuzione del programma. Se expression è true (diverso da zero), non verrà eseguita alcuna azione. Il messaggio di diagnostica include l'espressione non riuscita, il nome del file di origine e il numero di riga in cui l'asserzione non è riuscita.

Il messaggio di diagnostica viene stampato in caratteri wide (wchar_t). Pertanto, funzionerà come previsto anche se sono presenti caratteri Unicode nell'espressione.

La destinazione dei messaggi di diagnostica dipende dal tipo di applicazione che ha chiamato la routine. Le applicazioni console ricevono il messaggio tramite stderr. In un'applicazione basata su Windows chiama assert la funzione Windows MessageBox per creare una finestra di messaggio per visualizzare il messaggio con tre pulsanti: Interrompi, Riprova e Ignora. Se l'utente sceglie Interrompi, il programma viene interrotto immediatamente. Se l'utente sceglie Riprova, viene chiamato il debugger e l'utente può eseguire il debug del programma se è abilitato il debug JIT (Just-In-Time). Se l'utente sceglie Ignora, il programma continuerà con l'esecuzione normale. Se si fa clic su Ignora quando esiste una condizione di errore, è possibile che si verifica un comportamento non definito perché le precondizioni del codice chiamante non sono state soddisfatte.

Per eseguire l'override del comportamento di output predefinito indipendentemente dal tipo di app, chiamare _set_error_mode per selezionare tra il comportamento da output a stderr e display-dialog-box.

Dopo assert aver visualizzato il messaggio, chiama abort, che visualizza una finestra di dialogo con i pulsanti Interrompi, Riprova e Ignora . abort esce dal programma, quindi il pulsante Riprova e Ignora non riprenderà l'esecuzione del programma dopo la assert chiamata. Se assert viene visualizzata una finestra di dialogo, la abort finestra di dialogo non viene visualizzata. L'unica volta che viene visualizzata la abort finestra di dialogo, è quando assert invia l'output a stderr.

Di conseguenza del comportamento precedente, una finestra di dialogo viene sempre visualizzata dopo una assert chiamata in modalità di debug. Il comportamento di ogni pulsante viene acquisito nella tabella seguente.

Modalità errore Output in stderr (console/_OUT_TO_STDERR) Finestra di dialogo Visualizza (Windows/_OUT_TO_MSGBOX)
Abort Uscire immediatamente con il codice di uscita 3 Uscire immediatamente con il codice di uscita 3
Retry Eseguire l'interruzione nel debugger durante abort Eseguire l'interruzione nel debugger durante assert
Ignore Terminare l'uscita tramite abort Continuare il programma come se assert non fosse stato attivato (potrebbe comportare un comportamento non definito perché le precondizioni del codice chiamante non sono state soddisfatte)

Per altre informazioni sul debug CRT, vedere Tecniche di debug CRT.

Le funzioni _assert e _wassert sono funzioni CRT interne. Contribuiscono a ridurre al minimo il codice necessario nei file oggetto per supportare le asserzioni. Non è consigliabile chiamare direttamente queste funzioni.

La assert macro è abilitata sia nelle versioni di rilascio che di debug delle librerie di runtime C quando NDEBUG non viene definita. Quando NDEBUG viene definita, la macro è disponibile, ma non ne valuta l'argomento e non ha alcun effetto. Quando è abilitata, la assert macro chiama _wassert l'implementazione. Sono disponibili anche altre macro di asserzione, _ASSERT, _ASSERTE e _ASSERT_EXPR, ma valutano solo le espressioni passate quando la _DEBUG macro è stata definita e quando si trovano nel codice collegato alla versione di debug delle librerie di runtime C.

Requisiti

Ciclo Intestazione obbligatoria
assert, _wassert <assert.h>

La firma della _assert funzione non è disponibile in un file di intestazione. La firma della _wassert funzione è disponibile solo quando la NDEBUG macro non è definita.

Esempio

In questo programma la funzione analyze_string usa la macro assert per testare diverse condizioni correlate alla stringa e alla lunghezza. Se una qualsiasi delle condizioni non riesce, il programma stampa un messaggio indicando la causa dell'errore.

// crt_assert.c
// compile by using: cl /W4 crt_assert.c
#include <stdio.h>
#include <assert.h>
#include <string.h>

void analyze_string( char *string );   // Prototype

int main( void )
{
   char  test1[] = "abc", *test2 = NULL, test3[] = "";

   printf ( "Analyzing string '%s'\n", test1 ); fflush( stdout );
   analyze_string( test1 );
   printf ( "Analyzing string '%s'\n", test2 ); fflush( stdout );
   analyze_string( test2 );
   printf ( "Analyzing string '%s'\n", test3 ); fflush( stdout );
   analyze_string( test3 );
}

// Tests a string to see if it is NULL,
// empty, or longer than 0 characters.
void analyze_string( char * string )
{
   assert( string != NULL );        // Cannot be NULL
   assert( *string != '\0' );       // Cannot be empty
   assert( strlen( string ) > 2 );  // Length must exceed 2
}

Il programma genera l'output seguente:

Analyzing string 'abc'
Analyzing string '(null)'
Assertion failed: string != NULL, file crt_assert.c, line 25

Dopo l'errore di asserzione, a seconda della versione del sistema operativo e della libreria di runtime, è possibile che venga visualizzata una finestra di messaggio che contiene elementi simili a:

A problem caused the program to stop working correctly. Windows will close the program and notify you if a solution is available.

Se è installato un debugger, scegliere Debug per avviare il debugger oppure Chiudi programma per uscire.

Vedi anche

Gestione errori
Processo e controllo dell'ambiente
abort
raise
signal
_ASSERT, _ASSERTE, _ASSERT_EXPR macro
_DEBUG