Freigeben über


Gewusst wie eine Ablaufverfolgungsanweisung in ein C/C++-Makro einschließen?

Streng genommen können Sie keine Ablaufverfolgungsanweisung innerhalb eines Makros haben, da der WPP-Präprozessor vor dem C-Präprozessor ausgeführt wird. Eine Lösung besteht darin, den C-Präprozessor zweimal auszuführen, aber es gibt eine noch einfachere Lösung: Definieren Sie optionale PRE- und POST-Schritte für die Ablaufverfolgungsmakros.

Sie können z. B. ein Makro "Beenden bei fehlgeschlagen" verwenden, z. B.

If (FAILED(HR)) {
     DoTraceMessage(ERROR,"We failed!");
     Goto done ;
} 

In diesem Fall ermöglicht die Verwendung von PRE- und POST-Formularen des Makros dies.

Definieren der Funktion

Definieren Sie in der Quelldatei die Funktion, z. B.:

FUNC:_EXIT_IF_EXP_FAILED{LEVEL=WSM_ERROR}(_EXIT_IF_EXP_FAILED_EXP,MSG,...)

Definieren der Makros

Fügen Sie in einer Headerdatei die folgenden Definitionsdirektiven hinzu. Platzieren Sie sie nach der WPP_CONTROL_GUIDS Definition und vor der #include-Anweisung für die Headerdatei der Ablaufverfolgungsnachricht.

#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)

Hinzufügen von Formatierungen

Sie können die Lesbarkeit der Ablaufverfolgungsmeldungen vereinfachen, indem Sie Formatierungsdaten in die Headerdatei einfügen. Dieser Schritt ist optional.

// 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)

In diesem Beispiel identifizieren die begin_wpp-Konfigurations- und end_wpp-Anweisungen die Konfigurationsdaten in der Headerdatei für WPP.

Um WPP darüber zu informieren, dass in der Headerdatei Konfigurationsdaten vorhanden sind, fügen Sie den Parameter -scan dem RUN_WPP Makro hinzu, das den WPP-Präprozessor aufruft. Beispiel:

RUN_WPP -scan:trace.h

Eine vollständige Liste der optionalen Parameter für RUN_WPP finden Sie unter WPP-Präprozessor.

Verwenden der Makros

Verwenden Sie im Quellcode die Makros, z. B. im folgenden Aufruf:

_EXIT_IF_EXP_FAILED(hr,"it failed");