C/C++ マクロにトレース ステートメントを含める方法
厳密に言えば、WPP プリプロセッサは C プリプロセッサの前に実行されるため、マクロ内にトレース ステートメントを含めることはできません。 1 つの解決策は C プリプロセッサを 2 回実行することですが、さらに簡単なソリューションがあります。トレース マクロに対して省略可能な 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 config ステートメントと end_wpp ステートメントによって、WPP のヘッダー ファイル内の構成データが識別されます。
また、ヘッダー ファイルに構成データがあることを WPP に通知するには、WPP プリプロセッサを 呼び出す RUN_WPP マクロに -scan パラメーターを追加します。 次に例を示します。
RUN_WPP -scan:trace.h
RUN_WPP のオプション パラメーターの完全なリストについては、 「WPP プリプロセッサ」を参照してください。
マクロを使用する
ソース コードでは、次の呼び出しのようにマクロを使用します。
_EXIT_IF_EXP_FAILED(hr,"it failed");