2009-12-21 5 views
19

en C, quelle est la bonne façon de définir une macro comme printf qui ne s'imprime que lorsque le symbole DEBUG est défini?C Macros d'impression de débogage

#ifdef DEBUG 
#define DEBUG_PRINT(???) ??? 
#else 
#define DEBUG_PRINT(???) ??? 
#endif 

où ??? est l'endroit où je ne suis pas sûr de ce que remplir

+3

Dupe de http://stackoverflow.com/questions/1644868/c-define-macro-for-debug-printing parmi beaucoup d'autres. –

+0

a été demandé auparavant; lien vers mes réponses: http://stackoverflow.com/questions/1644868/c-define-macro-for-debug-printing/1645152#1645152 – Christoph

Répondre

14

Quelque chose comme:

#ifdef DEBUG 
#define DEBUG_PRINT(fmt, args...) fprintf(stderr, fmt, ## args) 
#else 
#define DEBUG_PRINT(fmt, args...) /* Don't do anything in release builds */ 
#endif 
19
#ifdef DEBUG 
#define DEBUG_PRINT(...) do{ fprintf(stderr, __VA_ARGS__); } while(false) 
#else 
#define DEBUG_PRINT(...) do{ } while (false) 
#endif 
+0

+1 pour '__VA_ARGS__', mais notez que seulement requis pour exister dans les implémentations C99 . – pmg

+4

En fait, vous n'avez pas besoin de l'idiome 'do {...} while (0)' autour de 'fprintf()' –

32

Je l'ai vu cet idiome une bonne quantité:

#ifdef DEBUG 
# define DEBUG_PRINT(x) printf x 
#else 
# define DEBUG_PRINT(x) do {} while (0) 
#endif 

utiliser comme:

DEBUG_PRINT(("var1: %d; var2: %d; str: %s\n", var1, var2, str)); 

Les parenthèses supplémentaires sont nécessaires, car certains anciens compilateurs C ne prennent pas en charge les var-args dans les macros.

+0

Merci pour l'annotation concernant les parenthèses supplémentaires. – kazbeel

2

Vous pouvez simplement utiliser:

#ifdef DEBUG 
    #define DEBUG_PRINT printf 
#else 
    #define DEBUG_PRINT 
#endif 
+0

si vous avez un code comme celui-ci 'if (x) DEBUG_PRINT (" SOME DEBUG ");' alors cela ne fonctionne pas. – Raj

2

Utilisez différentes signatures de debug_print, ils ne le sont pas nécessairement les mêmes, comme:

#ifdef DEBUG 
#define DEBUG_PRINT printf 
#else 
#define DEBUG_PRINT(...) 
#endif 

ainsi le mode de débogage l'appel debug_print sera être remplacé par printf. À la libération, il ignorera tous les arguments utilisés précédemment.

Espérons que ça aide.

9

Merci mipadi, j'ai aussi amélioré votre DEBUG_PRINT avec des informations sur les fichiers.

#define DEBUG 3 

#if defined(DEBUG) && DEBUG > 0 
#define DEBUG_PRINT(fmt, args...) fprintf(stderr, "DEBUG: %s:%d:%s(): " fmt, \ 
    __FILE__, __LINE__, __func__, ##args) 
#else 
#define DEBUG_PRINT(fmt, args...) /* Don't do anything in release builds */ 
#endif 

Testé avec le dernier clang, par ex.

int main(int argc, char **args) { 
    DEBUG_PRINT("Debugging is enabled.\n");  
    DEBUG_PRINT("Debug level: %d", (int) DEBUG); 
} 

sorties:

DEBUG: debug.c:13:main(): Debugging is enabled. 
DEBUG: debug.c:14:main(): Debug level: 3