Разделы справки включить инструкцию трассировки в макрос 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");