Condividi tramite


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");