2010-08-02 11 views

Respuesta

8

Dependiendo del valor de ENABLE_DEBUG, LOG_MSG se define ya sea para ser un alias para printf() o Se define como un macro no-op. Se implica que puede cambiar el valor a 0 para desactivar la depuración. Esta es una técnica común para facilitar el cambio entre compilaciones de depuración que muestran muchas versiones de salida y producción que son silenciosas.

#define LOG_MSG printf 

Esto hace que sea un alias para printf().

#define LOG_MSG(...) /* empty */ 

Y esto lo define como una macro vacía. Tenga en cuenta que aquí tiene un conjunto de paréntesis, lo que significa que la macro toma parámetros. No tiene nada después, lo que significa que se expande a absolutamente nada. Y el ... indica que esta macro puede tomar un varying number of arguments. Esta sintaxis es una extensión C99, por lo que es posible que no esté disponible en compiladores de C antiguos.

LOG_MSG("file not found\n"); 

El resultado es que una llamada LOG_MSG() o bien imprimir un mensaje o no hacer nada en función de si el registro está habilitado.

// If ENABLE_DEBUG is non-zero, a debugging printout: 
printf("file not found\n"); 

// If ENABLE_DEBUG is zero, an empty statement: 
; 

Por lo que vale la pena, quien fue autor de esta macro podría haber hecho un mejor trabajo mediante la sustitución de la primera definición con una utilizando la sintaxis ... (que él/ella es claramente familiarizado), impresión a stderr en lugar de stdout:

#define LOG_MSG(...) fprintf(stderr, __VA_ARGS__) 
1

Utiliza el preprocesador para cambiar el código antes de la compilación. Si ENABLE_DEBUG se define como 1, siempre que el preprocesador ve

LOG_MSG("something happened"); 

lo reemplazará con

printf("something happened"); 

Si se define como 0, o no se define lo reemplazará con nada (como el otra respuesta que acaba de ser publicada dice).

Cuestiones relacionadas