Поделиться через


Разделы справки включить инструкцию трассировки в макрос C/C++?

Строго говоря, вы не можете иметь инструкцию трассировки в макросе, так как препроцессор WPP выполняется до препроцессора C. Одним из решений является запуск препроцессора C дважды, но есть еще более простое решение: определите необязательные шаги PRE и POST для макросов трассировки.

Например, может потребоваться макрос "сбой выхода", например

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

В этом случае использование форм макроса PRE и POST делает это возможным.

Определение функции

В исходном файле определите функцию, например:

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

Определение макросов

В файле заголовка добавьте следующие директивы определения. Поместите их после определения WPP_CONTROL_GUIDS и перед инструкцией #include для файла заголовка сообщения трассировки.

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

Добавление форматирования

Вы можете упростить чтение сообщений трассировки, включив данные форматирования в файл заголовка. Это необязательный шаг.

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

В этом примере инструкции конфигурации begin_wpp и end_wpp определяют данные конфигурации в файле заголовка для WPP.

Кроме того, чтобы уведомить WPP о наличии данных конфигурации в файле заголовка, добавьте параметр -scan в макрос RUN_WPP, который вызывает препроцессор WPP. Пример:

RUN_WPP -scan:trace.h

Полный список необязательных параметров для RUN_WPP см. в разделе Препроцессор WPP.

Использование макросов

В исходном коде используйте макросы, например, в следующем вызове:

_EXIT_IF_EXP_FAILED(hr,"it failed");