2011-03-28 3 views
2

J'ai écrit la macro de trace suivante dans un fichier nommé "debug.h".Comment activer la macro TRACE personnalisée pour des fichiers spécifiques uniquement?

#define TRACE(x)  \ 
    printf(   \ 
     "%s(%d): ", \ 
     __FILE__, \ 
     __LINE__  \ 
     );   \ 
        \ 
    printf(x); 

En debug j'aimerais activer la macro que pour certains fichiers car les ressources sont limitées sur la plate-forme que j'utilise. Je ne veux pas supprimer complètement les appels TRACE des fichiers. Juste les désactiver.

Existe-t-il un moyen propre de faire cela en C en utilisant le préprocesseur?

Répondre

2

En debug.h:

#if TRACE_ENABLE 
#define TRACE(x)  \ 
    printf(   \ 
     "%s(%d): ", \ 
     __FILE__, \ 
     __LINE__  \ 
     );   \ 
        \ 
    printf(x); 
#else 
#define TRACE(x) 
#endif 

Ensuite, dans vos fichiers source où vous ne voulez pas trace:

#define TRACE_ENABLE 0 
#include "debug.h" 

ou tout simplement:

#include "debug.h" 

Dans les fichiers source pour permettre la trace:

#define TRACE_ENABLE 1 
#include "debug.h" 
0

Qu'en est-

#define TRACE(x, y) do if (y) {/*your prints*/} while (0) 

et aussi

#define TRACE_ENABLE 1 

ou

#define TRACE_ENABLE 0 

au sommet de vos sources.

ensuite remplacer les invocations TRACE avec

TRACE(foo, TRACE_ENABLE); 
1

Un truc que je l'ai utilisé somtimes est l'utilisation d'un masque de bits pour permettre à un sous-ensemble des fichiers whete TRACE est utilisé: fichier1.c:

#if TRACE_MASK & 0x01 
#define TRACE(x) ... 
#endif 

fichier2.c:

#if TRACE_MASK & 0x02 
#define TRACE(x) ... 
#endif 

... Ensuite, vous pouvez définir votre macro TRACE_MASK dans les options de prétraitement:/DTRACE_MASK = 0x03 pour activer la trace sur File1.c et File2.c Le seul problème est qu'il y a un nombre limité de bits ... (mais vous pouvez utiliser plus d'une macro: TRACE_MASK1, TRACE_MASK2 ...) Bye

EDIT: Bien sûr, vous pouvez écrire tdefinition fois dans un fichier "trace.h" et redéfinir juste le masque dans chaque source:

trace.h du fichier:

#if TRACE_MASK & TRACE_CURRENT 
#define TRACE(x) ... 
#else 
#define TRACE(x) do {} while(0) 
#endif 

fichier1.c:

#define TRACE_CURRENT 0x01 
#include "trace.h" 

fichier2.c:

#define TRACE_CURRENT 0x02 
#include "trace.h" 
1

Alors que les deux réponses semble bon pour moi, je pense que la réponse de Giuseppe est plus utile la plupart du temps car si vous utilisez cette macro plusieurs fois dans un fichier, et que vous voulez pour activer/désactiver le débogage pour les fichiers complets, la méthode de pmg est épuisante. L'important est de ne pas oublier d'ajouter l'instruction else: #else TRACE(X); si vous voulez modifier dans le fichier spécifique et non en-tête, utilisez:

#ifdef TRACE 
#undef TRACE 
#endif 
#define TRACE(X) 
Questions connexes