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