assert macro, _assert, _wassert

Evalúa una expresión y, cuando el resultado es false, imprime un mensaje de diagnóstico y anula el programa.

Sintaxis

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

Parámetros

expression
Una expresión escalar (incluidas las expresiones de puntero) que se evalúa en un valor que no es cero (true) o 0 (false).

message
El mensaje para mostrar.

filename
Nombre del archivo de origen en el que la aserción generó error.

line
Número de línea del archivo de origen de la aserción con error.

Comentarios

La macro assert se usa normalmente para identificar errores lógicos durante el desarrollo del programa. Úsela para detener la ejecución del programa cuando se produzcan condiciones inesperadas implementando el argumento expression para evaluar en false solo cuando el programa está funcionando incorrectamente. Se pueden desactivar las comprobaciones de aserción en tiempo de compilación definiendo la macro NDEBUG. Puede desactivar la macro assert sin modificar sus archivos de código fuente mediante una opción de la línea de comandos /DNDEBUG. Puede desactivar la macro assert del código fuente mediante una directiva #define NDEBUG antes de incluir <assert.h>.

La macro assert imprime un mensaje de diagnóstico cuando expression se evalúa como false (0) y llama a abort para detener la ejecución del programa. No se realiza ninguna acción si expression es true (distinto de cero). El mensaje de diagnóstico incluye la expresión del error, el nombre del archivo de origen y el número de línea en el que se produjo el error de la aserción.

El mensaje de diagnóstico se imprime en caracteres anchos (wchar_t). Por lo tanto, funcionará según lo previsto incluso si hay caracteres Unicode en la expresión.

El destino del mensaje de diagnóstico depende del tipo de aplicación que llamó a la rutina. Las aplicaciones de consola reciben el mensaje a través de stderr. En una aplicación basada en Windows, assert llama a la función MessageBox de Windows para crear un cuadro de mensaje que muestre el mensaje con tres botones: Anular, Reintentar y Omitir. Si el usuario elige Anular, el programa se anula inmediatamente. Si el usuario elige Reintentar, se llama al depurador y el usuario puede depurar el programa si la depuración Just-In-Time (JIT) está habilitada. Si el usuario elige Omitir, el programa continuará con la ejecución normal. Al hacer clic en Omitir cuando existe una condición de error, se puede producir un comportamiento indefinido, ya que no se han cumplido las condiciones previas del código de llamada.

Para invalidar el comportamiento de salida predeterminado con independencia del tipo de aplicación, llame a _set_error_mode para seleccionar entre el comportamiento de output-to-stderr y display-dialog-box.

Después de que assert muestre su mensaje, llama a abort, que muestra un cuadro de diálogo con los botones Anular, Reintentar y Omitir. abort sale del programa, por lo que los botones Reintentar y Omitir no reanudarán la ejecución del programa después de la llamada a assert. Si assert muestra un cuadro de diálogo, el cuadro de diálogo abort no se muestra. La única vez que se muestra el abort cuadro de diálogo es cuando assert envía su salida a stderr.

Como consecuencia del comportamiento anterior, siempre se muestra un cuadro de diálogo después de una llamada a assert en modo de depuración. En la tabla siguiente se recoge el comportamiento de cada botón.

Modo de error Salida a stderr (Consola/_OUT_TO_STDERR) Cuadro de diálogo Mostrar (Windows/_OUT_TO_MSGBOX)
Abort Salir inmediatamente con el código de salida 3 Salir inmediatamente con el código de salida 3
Retry Interrumpir en el depurador durante abort Interrumpir en el depurador durante assert
Ignore Finalizar la salida a través de abort Continuar programa como si assert no se desencadenara (puede dar lugar a un comportamiento indefinido, ya que no se cumplieron las condiciones previas del código de llamada)

Para obtener más información sobre la depuración de CRT, consulte Técnicas de depuración de CRT.

Las funciones _assert y _wassert son funciones de CRT internas. Ayudan a minimizar el código necesario en sus archivos de objeto para admitir aserciones. No se recomienda llamar a estas funciones directamente.

La macro assert está habilitada tanto en la versión de lanzamiento como en la versión de depuración de las bibliotecas en tiempo de ejecución de C cuando NDEBUG no está definido. Cuando NDEBUG se define, la macro está disponible, pero no evalúa su argumento y no tiene ningún efecto. Cuando se habilita, la macro assert llama a _wassert para su implementación. Otras macros de aserción (_ASSERT, _ASSERTE y _ASSERT_EXPR) también están disponibles, pero solo evalúan las expresiones que se les pasan cuando la macro _DEBUG se ha definido y cuando se encuentran en código vinculado con la versión de depuración de las bibliotecas en tiempo de ejecución de C.

Requisitos

Routine Encabezado necesario
assert, _wassert <assert.h>

La signatura de la función _assert no está disponible en un archivo de encabezado. La signatura de la función _wassert solo está disponible cuando la macro NDEBUG no está definida.

Ejemplo

En este programa, la función analyze_string usa la macro assert para probar varias condiciones relacionadas con la cadena y la longitud. Si se produce un error en cualquiera de las condiciones, el programa imprime un mensaje que indica la causa del error.

// 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
}

El programa genera esta salida:

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

Tras el error de aserción, según la versión del sistema operativo y la biblioteca en tiempo de ejecución, puede ver un cuadro de mensaje que contiene algo similar a lo siguiente:

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

Si hay un depurador instalado, elija el botón Depurar para iniciar el depurador o Cerrar programa , para salir.

Consulte también

Control de errores
Control de procesos y entornos
abort
raise
signal
Macros _ASSERT, _ASSERTE, _ASSERT_EXPR
_DEBUG