다음을 통해 공유


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에 알리려면 WPP 전처리기를 호출하는 RUN_WPP 매크로에 -scan 매개 변수를 추가합니다. 예를 들면 다음과 같습니다.

RUN_WPP -scan:trace.h

RUN_WPP 대한 선택적 매개 변수의 전체 목록은 WPP 전처리기를 참조하세요.

매크로 사용

소스 코드에서 다음 호출과 같은 매크로를 사용합니다.

_EXIT_IF_EXP_FAILED(hr,"it failed");