次の方法で共有


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");