如何在 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 参数添加到调用 WPP 预处理器的 RUN_WPP 宏。 例如:
RUN_WPP -scan:trace.h
有关RUN_WPP的可选参数的完整列表,请参阅 WPP 预处理器。
使用宏
在源代码中,使用 宏,例如在以下调用中:
_EXIT_IF_EXP_FAILED(hr,"it failed");