2012-07-18 21 views
5

Para el registro de depuración, he visto a menudo y se utiliza algo así comoadecuada C preprocesador macro no-op

#ifdef DEBUG 
    #define DLOG(fmt, args...) printf("%s:%d "fmt,__FILE__,__LINE__,args) 
#else 
    #define DLOG(fmt, args...) 
#endif 

pero en un número de lugares, he visto la segunda #define reemplazado con

#define DLOG(fmt, args...) do {} while (0) 

En particular, está this answer, y el comentario en this other answer a la misma pregunta sugiere que el problema estaría en una situación como

if (condition) 
    DLOG("foo"); 

aunque mi prueba rápida sugiere que el punto y coma resultante en la línea por sí solo servirá como la declaración no-operativa dentro del condicional.

Es uno u otro de nada y do {} while (0) mejor? Si es así, ¿por qué? ¿Hay algo más que sea aún mejor?

+0

posible duplicado de [do {...} while (0) ¿para qué sirve?] (Http://stackoverflow.com/questions/257418/do-while-0-what-is-it-good -para) –

Respuesta

5

Consulte C#define macro for debug printing para obtener una explicación de por qué quiere una forma diferente de no-op. ¿Quieres tener el compilador analiza el código de impresión de depuración, incluso cuando no lo está utilizando para que los errores no se introduzcan en

0

La respuesta rápida es que el método do/while le permite tener un reemplazo de instrucciones múltiples y aún así usarlo como una sola declaración en un caso if como el que tiene en su pregunta. Para un único reemplazo de expresión, no creo que haya ninguna diferencia.

7

Un punto y coma por sí mismo tiene dos inconvenientes:.

  • Los usuarios de la macro lata escríbalo sin punto y coma, y ​​el compilador no se quejará, y
  • Algunos compiladores pueden emitir una advertencia sobre un punto y coma posiblemente parásito.

Las direcciones do {} while (0) truco ambas estas preocupaciones:

DLOG("foo") // No semicolon 

activará un error, y el compilador no le avisará sobre un punto y coma "perdida".