Macros para los informes
Este tema se aplica a:
Edición |
Visual Basic |
C# |
F# |
C++ |
Web Developer |
---|---|---|---|---|---|
Express |
Sólo para código nativo |
||||
Pro, Premium y Ultimate |
Sólo para código nativo |
Las macros _RPTn y _RPTFn, definidas en CRTDBG.H, se pueden utilizar para reemplazar el uso de instrucciones printf para la depuración. Estas macros desaparecen automáticamente en la versión de lanzamiento cuando _DEBUG no está definido, de modo que no es necesario encerrarlas entre #ifdefs.
Macro |
Función |
---|---|
_RPT0, _RPT1, _RPT2, _RPT3, _RPT4 |
Escribe una cadena de mensaje y cero en cuatro argumentos. Para _RPT1 a _RPT4, la cadena de mensaje actúa como una cadena de formato al estilo de printf para los argumentos. |
_RPTF0, _RPTF1, _RPTF2, _RPTF4, |
Igual que _RPTn, pero estas macros también escriben el nombre del archivo y el número de línea donde se encuentra la macro. |
Considere el ejemplo siguiente:
#ifdef _DEBUG
if ( someVar > MAX_SOMEVAR )
printf( "OVERFLOW! In NameOfThisFunc( ),
someVar=%d, otherVar=%d.\n",
someVar, otherVar );
#endif
Este código escribe los valores de someVar y otherVar en stdout. Se puede utilizar la siguiente llamada a _RPTF2 para informar de estos mismos valores y, además, del nombre del archivo y el número de línea:
if (someVar > MAX_SOMEVAR) _RPTF2(_CRT_WARN, "In NameOfThisFunc( ), someVar= %d, otherVar= %d\n", someVar, otherVar );
Si una determinada aplicación debe proporcionar información de depuración que las macros de la biblioteca CRT no ofrecen, puede escribir una macro diseñada específicamente para satisfacer sus propios requisitos. En uno de los archivos de encabezado, por ejemplo, se podría incluir código como el siguiente para definir una macro denominada ALERT_IF2:
#ifndef _DEBUG /* For RELEASE builds */
#define ALERT_IF2(expr, msg, arg1, arg2) do {} while (0)
#else /* For DEBUG builds */
#define ALERT_IF2(expr, msg, arg1, arg2) \
do { \
if ((expr) && \
(1 == _CrtDbgReport(_CRT_ERROR, \
__FILE__, __LINE__, msg, arg1, arg2))) \
_CrtDbgBreak( ); \
} while (0)
#endif
Una llamada a ALERT_IF2 podría ejecutar todas las funciones del código printf del inicio de este tema:
ALERT_IF2(someVar > MAX_SOMEVAR, "OVERFLOW! In NameOfThisFunc( ),
someVar=%d, otherVar=%d.\n", someVar, otherVar );
Como una macro personalizada se puede cambiar fácilmente de modo que proporcione más o menos información para diferentes destinos (según convenga), este enfoque puede resultar particularmente útil a medida que los requisitos evolucionan.