2009-12-21 23 views
19

w C, jaki jest właściwy sposób zdefiniowania makra podobnego do printf, który będzie drukowany tylko po zdefiniowaniu symbolu DEBUG?C Debugowanie drukowania makr

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

gdzie ??? Tutaj nie jestem pewien co do wypełnienia

+3

Dupe od http://stackoverflow.com/questions/1644868/c-define-macro-for-debug-printing wśród wielu innych. –

+0

został zadany wcześniej; link do moich odpowiedzi: http://stackoverflow.com/questions/1644868/c-define-macro- for-debug-printing/1645152#1645152 – Christoph

Odpowiedz

14

coś takiego:

#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 dla '__VA_ARGS__', ale zauważ, że jest to wymagane tylko w implementacjach C99 . – pmg

+4

Właściwie, nie potrzebujesz 'do {...} while (0)' idiomu wokół 'fprintf()' –

32

Widziałem ten idiom sporo:

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

używać go jak:

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

Dodatkowe nawiasy są niezbędne, ponieważ niektóre starsze kompilatory C nie obsługują var-args w makrach.

+0

Dzięki za adnotację o dodatkowych nawiasach. – kazbeel

2

można po prostu użyć:

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

jeśli masz kod taki jak ten 'if (x) DEBUG_PRINT (" SOME DEBUG ");' to nie działa. – Raj

2

wykorzystują różne podpisy DEBUG_PRINT, nie muszą być takie same, jak:

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

ten sposób na wezwanie trybie debugowania będzie DEBUG_PRINT zostać zastąpione przez printf. Po wydaniu zignoruje wszystkie używane wcześniej argumenty.

Mam nadzieję, że to pomaga.

9

Dziękuję Ci mipadi, poprawiłem również DEBUG_PRINT z informacjami o plikach.

#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 

Testowany najnowszym klangiem, np.

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

wyjścia:

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