Ricerca per categorie includere un'istruzione di traccia in una macro C/C++?
In modo rigoroso, non è possibile avere un'istruzione di traccia all'interno di una macro, perché il preprocessore WPP viene eseguito prima del preprocessore C. Una soluzione consiste nell'eseguire il preprocessore C due volte, ma esiste una soluzione ancora più semplice: definire i passaggi PRE e POST facoltativi per le macro di traccia.
Ad esempio, è possibile che si voglia una macro "exit on failed", ad esempio
If (FAILED(HR)) {
DoTraceMessage(ERROR,"We failed!");
Goto done ;
}
In questo caso, l'uso di forme PRE e POST della macro rende possibile questa operazione.
Definire la funzione
Nel file di origine definire la funzione, ad esempio:
FUNC:_EXIT_IF_EXP_FAILED{LEVEL=WSM_ERROR}(_EXIT_IF_EXP_FAILED_EXP,MSG,...)
Definire le macro
In un file di intestazione aggiungere le direttive di definizione seguenti. Inserirli dopo la definizione di WPP_CONTROL_GUIDS e prima dell'istruzione #include per il file di intestazione del messaggio di traccia.
#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)
Aggiungere la formattazione
È possibile semplificare la lettura dei messaggi di traccia includendo la formattazione dei dati nel file di intestazione. Questo passaggio è facoltativo.
// 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)
In questo esempio, le istruzioni di configurazioneend_wpp e begin_wpp identificano i dati di configurazione nel file di intestazione per WPP.
Inoltre, per notificare a WPP che nel file di intestazione sono presenti dati di configurazione, aggiungere il parametro -scan alla macro RUN_WPP che richiama il preprocessore WPP. Ad esempio:
RUN_WPP -scan:trace.h
Per un elenco completo dei parametri facoltativi per RUN_WPP, vedere Preprocessore WPP.
Usare le macro
Nel codice sorgente usare le macro, ad esempio nella chiamata seguente:
_EXIT_IF_EXP_FAILED(hr,"it failed");