Compartilhar via


Como fazer incluir uma instrução de rastreamento em uma macro C/C++?

Estritamente falando, você não pode ter uma instrução de rastreamento dentro de uma macro, porque o pré-processador WPP é executado antes do pré-processador C. Uma solução é executar o pré-processador C duas vezes, mas há uma solução ainda mais simples: definir etapas opcionais de PRE e POST para as macros de rastreamento.

Por exemplo, talvez você queira uma macro "sair com falha", como

If (FAILED(HR)) {
     DoTraceMessage(ERROR,"We failed!");
     Goto done ;
} 

Nesse caso, o uso de formulários PRE e POST da macro possibilita isso.

Definir a função

No arquivo de origem, defina a função, por exemplo:

FUNC:_EXIT_IF_EXP_FAILED{LEVEL=WSM_ERROR}(_EXIT_IF_EXP_FAILED_EXP,MSG,...)

Definir as macros

Em um arquivo de cabeçalho, adicione as diretivas de definição a seguir. Coloque-os após a definição de WPP_CONTROL_GUIDS e antes da instrução #include para o arquivo de cabeçalho da mensagem de rastreamento.

#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)

Adicionar formatação

Você pode facilitar a leitura das mensagens de rastreamento, incluindo a formatação de dados no arquivo de cabeçalho. Esta etapa é 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)

Neste exemplo, as instruções begin_wpp configuração e end_wpp identificam os dados de configuração no arquivo de cabeçalho do WPP.

Além disso, para notificar o WPP de que há dados de configuração no arquivo de cabeçalho, adicione o parâmetro -scan à macro RUN_WPP que invoca o pré-processador WPP. Por exemplo:

RUN_WPP -scan:trace.h

Para obter uma lista completa dos parâmetros opcionais para RUN_WPP, consulte Pré-processador WPP.

Usar as macros

No código-fonte, use as macros, como na chamada a seguir:

_EXIT_IF_EXP_FAILED(hr,"it failed");