2009-12-21 14 views
19

en C, ¿cuál es la forma correcta de definir una macro tipo printf que se imprimirá solo cuando se define el símbolo DEBUG?C Macros de impresión de depuración

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

donde ??? es donde no estoy seguro de lo que rellene

+3

Dupe de http://stackoverflow.com/questions/1644868/c-define-macro-for-debug-printing entre muchos otros. –

+0

se le ha preguntado antes; enlace a mis respuestas: http://stackoverflow.com/questions/1644868/c-define-macro-for-debug-printing/1645152#1645152 – Christoph

Respuesta

14

Algo así como:

#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 para '__VA_ARGS__', pero tenga en cuenta que solo es necesario que exista en las implementaciones C99 . – pmg

+4

En realidad, no necesita la expresión 'do {...} while (0)' alrededor de 'fprintf()' –

32

que he visto este idioma una cantidad justa:

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

usarlo como:

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

Los paréntesis adicionales son necesarios, porque algunos compiladores C antiguos no admiten var-args en macros.

+0

Gracias por la anotación sobre los paréntesis adicionales. – kazbeel

2

Usted puede simplemente utilizar:

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

si tiene un código como este 'if (x) DEBUG_PRINT (" SOME DEBUG ");' entonces esto no funciona. – Raj

2

utilizar diferentes firmas de DEBUG_PRINT, que no tiene que ser el mismo, como:

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

esta manera el modo de depuración de la llamada se DEBUG_PRINT ser reemplazado con printf. En la versión ignorará todos los argumentos usados ​​previamente.

Espero que ayude.

9

Gracias mipadi, mejoré tu DEBUG_PRINT con información del archivo también.

#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 

Probado con el último clang, p.

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

salidas:

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