Partager via


Comment faire inclure une instruction de trace dans une macro C/C++ ?

À proprement parler, vous ne pouvez pas avoir d’instruction de trace dans une macro, car le préprocesseur WPP s’exécute avant le préprocesseur C. Une solution consiste à exécuter le préprocesseur C deux fois, mais il existe une solution encore plus simple : définir des étapes PRE et POST facultatives pour les macros de trace.

Par exemple, vous souhaiterez peut-être une macro « exit on failed », telle que

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

Dans ce cas, l’utilisation des formes PRE et POST de la macro rend cela possible.

Définir la fonction

Dans le fichier source, définissez la fonction, par exemple :

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

Définir les macros

Dans un fichier d’en-tête, ajoutez les directives de définition suivantes. Placez-les après la définition WPP_CONTROL_GUIDS et avant l’instruction #include pour le fichier d’en-tête de message de trace.

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

Ajouter une mise en forme

Vous pouvez faciliter la lecture des messages de trace en incluant la mise en forme des données dans le fichier d’en-tête. Cette étape est facultative.

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

Dans cet exemple, les instructions begin_wpp config et end_wpp identifient les données de configuration dans le fichier d’en-tête pour WPP.

En outre, pour informer WPP qu’il existe des données de configuration dans le fichier d’en-tête, ajoutez le paramètre -scan à la macro RUN_WPP qui appelle le préprocesseur WPP. Par exemple :

RUN_WPP -scan:trace.h

Pour obtenir la liste complète des paramètres facultatifs pour RUN_WPP, consultez Préprocesseur WPP.

Utiliser les macros

Dans le code source, utilisez les macros, comme dans l’appel suivant :

_EXIT_IF_EXP_FAILED(hr,"it failed");