Macro de depuración del preprocesador para el registro opcional
-
05-07-2019 - |
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?
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.