Macros _ASSERT
, _ASSERTE
, _ASSERT_EXPR
Evalúa una expresión y genera un informe de depuración cuando el resultado es false
(solo la versión de depuración).
Sintaxis
// Typical usage:
_ASSERT_EXPR( booleanExpression, message );
_ASSERT( booleanExpression );
_ASSERTE( booleanExpression );
Parámetros
booleanExpression
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
Una cadena de caracteres anchos para mostrarla como parte del informe.
Comentarios
Las _ASSERT_EXPR
, _ASSERT
y _ASSERTE
ofrecen una aplicación con un mecanismo simple y limpio para comprobar suposiciones durante el proceso de depuración. Son flexibles porque no necesitan incluirse en #ifdef
instrucciones para evitar que se llamen en una compilación comercial de una aplicación. Esta flexibilidad se logra mediante la macro _DEBUG
. _ASSERT_EXPR
, _ASSERT
y _ASSERTE
solo están disponibles cuando _DEBUG
se define en tiempo de compilación. Cuando no se define _DEBUG
, las llamadas a estas macros se quitan durante el preprocesamiento.
_ASSERT_EXPR
, _ASSERT
y _ASSERTE
evalúan su argumento booleanExpression
y cuando el resultado es false
(0), imprimen un mensaje de diagnóstico y llaman a _CrtDbgReportW
para generar un informe de depuración. La macro _ASSERT
imprime un mensaje de diagnóstico simple, _ASSERTE
incluye una representación de cadena de la expresión de error en el mensaje y _ASSERT_EXPR
incluye la cadena message
en el mensaje de diagnóstico. Estas macros no hacen nada cuando booleanExpression
se evalúa como un valor diferente a cero.
_ASSERT_EXPR
, _ASSERT
y _ASSERTE
invocan _CrtDbgReportW
, lo que hace que toda la salida esté en caracteres anchos. _ASSERTE
imprime correctamente los caracteres Unicode en booleanExpression
y _ASSERT_EXPR
imprime caracteres Unicode en message
.
Dado que la macro _ASSERTE
especifica la expresión del error y que _ASSERT_EXPR
permite especificar un mensaje en el informe generado, permiten que los usuarios identifiquen el problema sin hacer referencia al código fuente. Sin embargo, existe una desventaja en el sentido de que se incluye cada message
que se imprime por _ASSERT_EXPR
y cada expresión evaluada por _ASSERTE
en el archivo de salida (versión de depuración) de la aplicación como una constante de cadena. Por tanto, si se realiza un gran número de llamadas a _ASSERT_EXPR
o _ASSERTE
, estas expresiones pueden aumentar considerablemente el tamaño del archivo de salida.
A menos que se especifique lo contrario con las funciones _CrtSetReportMode
y _CrtSetReportFile
, aparecen mensajes en un cuadro de diálogo emergente equivalente a establecer lo siguiente:
_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_WNDW);
_CrtDbgReportW
genera el informe de depuración y determina los destinos en función de los modos de informe actuales y el archivo definidos para el tipo de informe _CRT_ASSERT
. De manera predeterminada, los errores de aserción y los demás errores se dirigen a una ventana de mensajes de depuración. Las funciones _CrtSetReportMode
y _CrtSetReportFile
se usan para definir los destinos de cada tipo de informe.
Cuando el destino es una ventana de mensajes de depuración y el usuario selecciona el botón Reintentar , _CrtDbgReportW
devuelve 1, lo que hace que las _ASSERT_EXPR
macros y _ASSERT
_ASSERTE
inicien el depurador si la depuración Just-In-Time (JIT) está habilitada.
Para obtener más información sobre el proceso de informes, vea la función _CrtDbgReport
, _CrtDbgReportW
. Para obtener más información sobre cómo resolver errores de aserción y usar estas macros como mecanismo de control de errores de depuración, consulte Macros para informes.
Además de las macros _ASSERT
, la macro assert
se puede usar para comprobar la lógica del programa. Esta macro está disponible en las versiones de lanzamiento y depuración de las bibliotecas. Las macros de depuración _RPT
, _RPTF
también están disponibles para generar un informe de depuración, pero no evalúan una expresión. Las macros _RPT
generan un informe sencillo. Las macros _RPTF
incluyen el número de línea y el archivo de origen donde se llamó a la macro de informe en el informe generado. Las versiones de caracteres anchos de estas macros están disponibles (_RPTW
, _RPTFW
). Las versiones de caracteres anchos son idénticas a las versiones de caracteres estrechos, salvo que se usan cadenas de caracteres anchos para todos los parámetros de cadena y la salida.
Aunque _ASSERT_EXPR
, _ASSERT
y _ASSERTE
son macros y están disponibles mediante la inclusión de <crtdbg.h>
, la aplicación debe vincularse a una versión de depuración de la biblioteca en tiempo de ejecución de C cuando se define _DEBUG
, ya que estas macros llaman a otras funciones en tiempo de ejecución.
Requisitos
Macro | Encabezado necesario |
---|---|
_ASSERT_EXPR , , _ASSERT , _ASSERTE |
<crtdbg.h> |
Ejemplo
En este programa, se realizan llamadas a las macros _ASSERT
y _ASSERTE
para probar la condición string1 == string2
. Si se produce un error en la condición, estas macros imprimen un mensaje de diagnóstico. También se aplican el grupo de macros _RPT
y _RPTF
en este programa como alternativa a la función 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;
}
Use the assert macros to evaluate the expression p1 == p2.
crt_ASSERT_macro.c(54) :
Will _ASSERT find 'I am p1' == 'I am p2' ?
crt_ASSERT_macro.c(55) : Assertion failed!
crt_ASSERT_macro.c(58) :
Will _ASSERTE find 'I am p1' == 'I am p2' ?
crt_ASSERT_macro.c(59) : Assertion failed: p1 == p2
'I am p1' != 'I am p2'
Consulte también
Rutinas de depuración
Macro assert
, _assert
, _wassert
Macros _RPT
, _RPTF
, _RPTW
, _RPTFW