¿Depurar macro de impresión en C?

3 minutos de lectura

¿Depurar macro de impresion en C
Juan

en C, ¿cuál es la forma correcta de definir una macro similar a printf que se imprimirá solo cuando se defina el símbolo DEBUG?

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

donde ??? es donde no estoy seguro de qué llenar

  • Dupe de stackoverflow.com/questions/1644868/… entre muchos otros.

    luego

    21 de diciembre de 2009 a las 17:04

  • se ha preguntado antes; enlace a mis respuestas: stackoverflow.com/questions/1644868/…

    – Cristóbal

    21 de diciembre de 2009 a las 17:04

  • Posible duplicado de C #define macro para la impresión de depuración

    – Tim

    10 de noviembre de 2018 a las 23:26

He visto este modismo una buena cantidad:

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

Úsalo como:

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

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

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

    – kazbel

    11 mayo 2016 a las 11:22


  • Veo algunos errores menores en su implementación (faltan paréntesis alrededor xpor ejemplo, y no usar __VA_ARGS__). Entonces, aquí está mi enfoque, basado en el tuyo.

    – Gabriel grapas

    24 de mayo de 2021 a las 5:43


  • @GabrielStaples Esta respuesta tiene la intención de explicar un código muy antiguo, que es anterior a la __VA_ARGS__ enfoque basado. En código de menos de 20 años, sin duda debería preferir __VA_ARGS__.

    – Aidan Cully

    6 jun 2021 a las 18:20

#ifdef DEBUG
#define DEBUG_PRINT(...) do{ fprintf( stderr, __VA_ARGS__ ); } while( false )
#else
#define DEBUG_PRINT(...) do{ } while ( false )
#endif

  • +1 para __VA_ARGS__pero tenga en cuenta que solo es necesario que exista en las implementaciones de C99.

    – pmg

    21 de diciembre de 2009 a las 17:10

  • En realidad, no necesitas el do { ... } while (0) lenguaje alrededor del fprintf()

    – Remo.D

    21 de diciembre de 2009 a las 22:06

  • Para que conste, debe usar C99 para VA_ARGS trabajar. Use -std-c99 en sus CFLAGS

    – Larry_C

    13 de febrero a las 22:23

Algo 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

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

#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 sonido metálico, por ejemplo

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

Use diferentes firmas de DEBUG_PRINT, no tienen que ser iguales, como:

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

de esta manera, en el modo de depuración, la llamada DEBUG_PRINT se reemplazará con printf. En el lanzamiento, ignorará todos los argumentos utilizados anteriormente.

Espero eso ayude.

1647575886 408 ¿Depurar macro de impresion en C
equilón

Simplemente puede usar:

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

¿Depurar macro de impresion en C
justin torre

Me gusta más de esta manera porque no agregará ninguna instrucción asm a la compilación de su versión.

#define DEBUG
#ifdef DEBUG
#define  debug_printf(fmt, ...)  printf(fmt, __VA_ARGS__);
#else
#define debug_printf(fmt, ...)    /* Do nothing */
#endif

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad