2009-12-21 27 views
19

in C, qual è il modo corretto per definire una macro di printf che stamperà solo quando viene definito il simbolo DEBUG?C Debug Print Macro

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

dove ??? è dove io non sono sicuro di cosa riempire

+3

Dupe di http://stackoverflow.com/questions/1644868/c-define-macro-for-debug-printing tra molti altri. –

+0

è stato richiesto prima; link alle mie risposte: http://stackoverflow.com/questions/1644868/c-define-macro-for-debug-printing/1645152#1645152 – Christoph

risposta

14

Qualcosa di simile:

#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 per '__VA_ARGS__', ma nota che è richiesto solo di esistere nelle implementazioni C99 . – pmg

+4

In realtà, non è necessario l'idioma 'do {...} while (0)' attorno a 'fprintf()' –

32

Ho visto questo idioma una discreta quantità:

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

utilizzarlo come:

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

Le parentesi aggiuntive sono necessarie, perché alcuni compilatori C meno recenti non supportano var-args nelle macro.

+0

Grazie per l'annotazione sulle parentesi aggiuntive. – kazbeel

2

Si può semplicemente utilizzare:

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

se si dispone di un codice come questo 'if (x) DEBUG_PRINT (" SOME DEBUG ");' allora questo non funziona. – Raj

2

utilizzare diverse firme di DEBUG_PRINT, che non c'è bisogno di essere lo stesso, come:

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

questo modo sulla modalità di debug la chiamata sarà DEBUG_PRINT essere sostituito con printf. Al rilascio, ignorerà tutti gli argomenti utilizzati in precedenza.

Spero che aiuti.

9

Grazie mipadi, ho migliorato anche il tuo DEBUG_PRINT con le informazioni del file.

#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 

Testato con l'ultimo clang, ad es.

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

uscite:

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