Macro assert, _assert, _wassertassert Macro, _assert, _wassert

Valuta un'espressione e, quando il risultato è false, stampa un messaggio di diagnostica e arresta il programma.Evaluates an expression and, when the result is false, prints a diagnostic message and aborts the program.

SintassiSyntax

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

ParametriParameters

expression
Espressione scalare (incluse le espressioni puntatore) che restituisce un valore diverso da zero (true) oppure 0 (false).A scalar expression (including pointer expressions) that evaluates to nonzero (true) or 0 (false).

message
Messaggio da visualizzare.The message to display.

filename
Nome del file di origine in cui l'asserzione non è riuscita.The name of the source file the assertion failed in.

line
Numero di riga nel file di origine dell'asserzione non riuscita.The line number in the source file of the failed assertion.

NoteRemarks

La assert viene in genere usata per identificare gli errori di logica durante lo sviluppo di programmi.The assert macro is typically used to identify logic errors during program development. 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.Use it to stop program execution when unexpected conditions occur by implementing the expression argument to evaluate to false only when the program is operating incorrectly. I controlli delle asserzioni possono essere disattivati in fase di compilazione definendo la macro NDEBUG.Assertion checks can be turned off at compile time by defining the macro NDEBUG. È possibile disattivare la macro assert senza modificare i file di origine usando un'opzione della riga di comando /DNDEBUG .You can turn off the assert macro without modifying your source files by using a /DNDEBUG command-line option. È possibile disattivare la macro assert nel codice sorgente usando una direttiva #define NDEBUG prima di includere <assert.h>.You can turn off the assert macro in your source code by using a #define NDEBUG directive before <assert.h> is included.

La macro assert stampa un messaggio di diagnostica quando expression restituisce false (0) e chiama abort per terminare l'esecuzione del programma.The assert macro prints a diagnostic message when expression evaluates to false (0) and calls abort to terminate program execution. Se expression è true (diverso da zero), non verrà eseguita alcuna azione.No action is taken if expression is true (nonzero). 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.The diagnostic message includes the failed expression, the name of the source file and line number where the assertion failed.

Il messaggio di diagnostica viene visualizzato in caratteri wide.The diagnostic message is printed in wide characters. Pertanto, funzionerà come previsto anche se sono presenti caratteri Unicode nell'espressione.Thus, it will work as expected even if there are Unicode characters in the expression.

La destinazione dei messaggi di diagnostica dipende dal tipo di applicazione che ha chiamato la routine.The destination of the diagnostic message depends on the type of application that called the routine. Le applicazioni console ricevono sempre il messaggio tramite stderr.Console applications always receive the message through stderr. In un'applicazione basata su Windows assert chiama la funzione MessageBox di Windows per creare una finestra di messaggio per visualizzare il messaggio con un pulsante OK .In a Windows-based application, assert calls the Windows MessageBox function to create a message box to display the message along with an OK button. Quando l'utente fa clic su OK, il programma terminerà immediatamente.When the user clicks OK, the program aborts immediately.

Quando l'applicazione viene collegata a una versione di debug delle librerie di runtime, assert crea una finestra di messaggio con tre pulsanti: Interrompi, Riprovae Ignora.When the application is linked with a debug version of the run-time libraries, assert creates a message box with three buttons: Abort, Retry, and Ignore. Se l'utente fa clic su Interrompi, il programma terminerà immediatamente.If the user clicks Abort, the program aborts immediately. Se l'utente fa clic su Riprova, il debugger viene chiamato e l'utente può eseguire il debug del programma se il debug JIT (Just-In-Time) è abilitato.If the user clicks Retry, the debugger is called and the user can debug the program if just-in-time (JIT) debugging is enabled. Se l'utente fa clic su Ignora, assert continua con l'esecuzione normale: creando la finestra di messaggio con il pulsante OK .If the user clicks Ignore, assert continues with its normal execution: creating the message box with the OK button. Si noti che facendo clic su Ignora quando esiste una condizione di errore può verificarsi un comportamento indefinito.Note that clicking Ignore when an error condition exists can result in undefined behavior.

Per ulteriori informazioni sul debug CRT, vedere Tecniche di debug CRT.For more information about CRT debugging, see CRT Debugging Techniques.

Le funzioni _assert e _wassert sono funzioni CRT interne.The _assert and _wassert functions are internal CRT functions. Contribuiscono a ridurre al minimo il codice necessario nei file oggetto per supportare le asserzioni.They help minimize the code required in your object files to support assertions. Non è consigliabile chiamare direttamente queste funzioni.We do not recommend that you call these functions directly.

La macro assert è abilitata sia nella versione di rilascio che nella versione di debug delle librerie di runtime C quando NDEBUG non è definito.The assert macro is enabled in both the release and debug versions of the C run-time libraries when NDEBUG is not defined. Quando NDEBUG è definito, la macro è disponibile ma non valuta il relativo argomento e non ha alcun effetto.When NDEBUG is defined, the macro is available but does not evaluate its argument and has no effect. Quando è abilitata, la macro assert chiama _wassert per la sua implementazione.When it is enabled, the assert macro calls _wassert for its implementation. Sono disponibili anche altre macro di asserzione, _ASSERT, _ASSERTE e _ASSERT_EXPR, ma queste valutano solo le espressioni passate loro al momento della definizione della macro _DEBUG e quando si trovano nel codice collegato alla versione di debug delle librerie di runtime C.Other assertion macros, _ASSERT, _ASSERTE and _ASSERT_EXPR, are also available, but they only evaluate the expressions passed to them when the _DEBUG macro has been defined and when they are in code linked with the debug version of the C run-time libraries.

RequisitiRequirements

RoutineRoutine Intestazione obbligatoriaRequired header
assert, _wassertassert, _wassert <assert.h><assert.h>

La firma della funzione _assert non è disponibile in un file di intestazione.The signature of the _assert function is not available in a header file. La firma della funzione _wassert è disponibile solo quando la macro NDEBUG non è definita.The signature of the _wassert function is only available when the NDEBUG macro is not defined.

EsempioExample

In questo programma la funzione analyze_string usa la macro assert per testare diverse condizioni correlate alla stringa e alla lunghezza.In this program, the analyze_string function uses the assert macro to test several conditions related to string and length. Se una qualsiasi delle condizioni non riesce, il programma stampa un messaggio indicando la causa dell'errore.If any of the conditions fails, the program prints a message indicating what caused the failure.

// 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:The program generates this output:

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, viene visualizzata una finestra di messaggio che contiene un messaggio analogo al seguente:After the assertion failure, depending on the version of the operating system and run-time library, you may see a message box that contains something like the following:

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.If a debugger is installed, choose the Debug button to start the debugger, or Close program to exit.

Vedere ancheSee Also

Gestione degli errori Error Handling
Controllo processo e ambiente Process and Environment Control
abort abort
raise raise
signal signal
Macro _ASSERT, _ASSERTE, _ASSERT_EXPR _ASSERT, _ASSERTE, _ASSERT_EXPR Macros
_DEBUG_DEBUG