Pregunta

Me gustaría codificar en algunas macros de preprocesador para registrar opcionalmente cierta información. Por ejemplo en el .h

//#define ML_DEBUG(x) (x)  // flip this bit to do the error logging
#define ML_DEBUG(x) (1==1) // flip this bit to silence

en el .m implemento como:

ML_DEBUG(NSLog(@"Class dealloc: %@", [NSString stringWithCString:object_getClassName(self)]));

El código funciona bien como lo he presentado. Sin embargo, no creo que mi " no haga nada " El caso es tan ligero como podría ser. Esperaba escribir:

//#define ML_DEBUG(x) (x)  // flip this bit to do the error logging
#define ML_DEBUG(x) (;) // flip this bit to silence

Dado que un punto y coma en solitario es una declaración válida de objetivo-c, esperaba que esto funcionara, pero el compilador me dice:

expected expression before ';' token

Mi pregunta es: ¿elegí el más liviano " no hago nada " declaración, usando 1 == 1 o hay una forma menos intensiva de hacerlo. ¿O tal vez mi enfoque completo para el registro de depuración temporal es erróneo?

¿Fue útil?

Solución

Lo más simple es una definición vacía:

#define ML_DEBUG(x)

Esto funciona para la mayoría de los casos, pero no funciona con el operador ternario, por ejemplo:

something ? ML_DEBUG(x) : ML_DEBUG(y);

Para poder trabajar en este ejemplo (admitido), puedes hacer esto:

#define ML_DEBUG(x) ((void)0)

Es perfectamente válido lanzar cosas para anular, le dice al compilador que estás ignorando explícitamente el resultado de la expresión.

Es por este motivo que la macro ANcode C estándar assert () se convierte en ((vacío) 0) cuando se define NDEBUG en lugar de la declaración vacía.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top