2009-12-21 20 views
19

in C, was ist die richtige Methode zum Definieren eines printf-ähnlichen Makros, das nur gedruckt wird, wenn das DEBUG-Symbol definiert ist?C Debug Drucken von Makros

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

wo ??? ist, wo ich bin nicht sicher, was in

+3

Dupe von http://stackoverflow.com/questions/1644868/c-define-macro-for-debug-printing unter vielen anderen. –

+0

wurde zuvor gefragt; Link zu meinen Antworten: http://stackoverflow.com/questions/1644868/c-define-macro-for-debug-printing/1645152#1645152 – Christoph

Antwort

14

So etwas zu füllen:

#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 für '__VA_ARGS__', aber beachten Sie, dass nur in C99-Implementierungen vorhanden sein muss . – pmg

+4

Eigentlich brauchen Sie nicht das 'do {...} while (0)' Idiom um das 'fprintf()' –

32

Ich habe gesehen, dieses Idiom eine ganze Menge:

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

verwenden Sie es wie:

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

Die zusätzlichen Klammern sind notwendig, weil einige ältere C-Compiler Var-Args in Makros nicht unterstützen.

+0

Danke für die Anmerkung über die zusätzlichen Klammern. – kazbeel

2

Sie können einfach verwenden:

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

Wenn Sie einen Code wie diesen haben 'if (x) DEBUG_PRINT (" EINIGE DEBUG ");' dann funktioniert das nicht. – Raj

2

Verwenden Sie verschiedene Signaturen von DEBUG_PRINT, sie haben nicht die gleiche sein, wie:

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

auf diese Weise auf den Debug-Modus der DEBUG_PRINT Anruf wird durch printf ersetzt werden. Bei der Veröffentlichung werden alle zuvor verwendeten Argumente ignoriert.

Ich hoffe, es hilft.

9

Vielen Dank Mipadi, verbesserte ich Ihre DEBUG_PRINT mit Dateiinformationen auch.

#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 

Getestet mit spätem clang, z.

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

Ausgänge:

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