Cómo incluir una instrucción de seguimiento en una macro de C/C++?
Estrictamente hablando, no puede tener una instrucción de seguimiento dentro de una macro, porque el preprocesador de WPP se ejecuta antes del preprocesador de C. Una solución consiste en ejecutar el preprocesador de C dos veces, pero hay una solución aún más sencilla: definir pasos OPCIONALes PRE y POST para las macros de seguimiento.
Por ejemplo, es posible que desee una macro "exit on failed", como
If (FAILED(HR)) {
DoTraceMessage(ERROR,"We failed!");
Goto done ;
}
En este caso, el uso de formularios PRE y POST de la macro hace posible esto.
Definición de la función
En el archivo de origen, defina la función, por ejemplo:
FUNC:_EXIT_IF_EXP_FAILED{LEVEL=WSM_ERROR}(_EXIT_IF_EXP_FAILED_EXP,MSG,...)
Definición de las macros
En un archivo de encabezado, agregue las siguientes directivas de definición. Colóquelos después de la definición de WPP_CONTROL_GUIDS y antes de la instrucción #include para el archivo de encabezado del mensaje de seguimiento.
#define WPP_LEVEL__EXIT_IF_EXP_FAILED_EXP_PRE(LEVEL, HR) {HRESULT hr=S_OK ; if(FAILED(hr = HR)) {
#define WPP_LEVEL__EXIT_IF_EXP_FAILED_EXP_POST(LEVEL, HR) ; goto done; } }
#define WPP_LEVEL__EXIT_IF_EXP_FAILED_EXP_ENABLED(LEVEL, HR) WPP_LEVEL_ENABLED(LEVEL)
#define WPP_LEVEL__EXIT_IF_EXP_FAILED_EXP_LOGGER(LEVEL, HR) WPP_LEVEL_LOGGER(WSM_ERROR)
Agregar formato
Puede facilitar la lectura de los mensajes de seguimiento mediante la inclusión de formato de datos en el archivo de encabezado. Este paso es opcional.
// MACRO: _EXIT_IF_EXP_FAILED
//
// begin_wpp config
// USEPREFIX (_EXIT_IF_EXP_FAILED,"%!STDPREFIX!");
// FUNC _EXIT_IF_EXP_FAILED{LEVEL=WSM_ERROR}(_EXIT_IF_EXP_FAILED_EXP,MSG,...);
// USESUFFIX (_EXIT_IF_EXP_FAILED," hr= %!HRESULT!", hr);
// end_wpp
#define WPP_LEVEL__EXIT_IF_EXP_FAILED_EXP_PRE(LEVEL, HR) {HRESULT hr=S_OK ; if(FAILED(hr = HR)) {
#define WPP_LEVEL__EXIT_IF_EXP_FAILED_EXP_POST(LEVEL, HR) ; goto done; } }
#define WPP_LEVEL__EXIT_IF_EXP_FAILED_EXP_ENABLED(TRACELEVEL, HR) WPP_LEVEL_ENABLED(TRACELEVEL)
#define WPP_LEVEL__EXIT_IF_EXP_FAILED_EXP_LOGGER(LEVEL, HR) WPP_LEVEL_LOGGER(WSM_ERROR)
En este ejemplo, las instrucciones begin_wpp config y end_wpp identifican los datos de configuración en el archivo de encabezado para WPP.
Además, para notificar a WPP que hay datos de configuración en el archivo de encabezado, agregue el parámetro -scan a la macro RUN_WPP que invoca el preprocesador de WPP. Por ejemplo:
RUN_WPP -scan:trace.h
Para obtener una lista completa de los parámetros opcionales para RUN_WPP, consulte Preprocesador de WPP.
Uso de las macros
En el código fuente, use las macros, como en la siguiente llamada:
_EXIT_IF_EXP_FAILED(hr,"it failed");