Macro di debug del preprocessore per la registrazione opzionale
-
05-07-2019 - |
Domanda
Vorrei codificare in alcune macro pre-processore per registrare facoltativamente alcune informazioni. Ad esempio nel .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
nel .m implemento come:
ML_DEBUG(NSLog(@"Class dealloc: %@", [NSString stringWithCString:object_getClassName(self)]));
Il codice funziona bene come l'ho presentato. Tuttavia, non credo che il mio " non faccia nulla " la custodia è leggera come potrebbe essere. Mi aspettavo di scrivere:
//#define ML_DEBUG(x) (x) // flip this bit to do the error logging
#define ML_DEBUG(x) (;) // flip this bit to silence
Dato che un punto e virgola solitario è una dichiarazione obiettiva-c valida, mi aspettavo che funzionasse, ma il compilatore mi sta dicendo:
expected expression before ';' token
La mia domanda è: ho scelto il più leggero " non fare nulla " , usando 1 == 1
o c'è un modo meno intensivo per farlo. O forse il mio intero approccio alla registrazione temporanea del debug è sbagliato?
Soluzione
La cosa più semplice è una definizione vuota:
#define ML_DEBUG(x)
Funziona nella maggior parte dei casi, ma non funziona con l'operatore ternario, ad esempio:
something ? ML_DEBUG(x) : ML_DEBUG(y);
Per lavorare per questo esempio (certamente inventato), puoi farlo:
#define ML_DEBUG(x) ((void)0)
È perfettamente valido lanciare le cose su nulla - dice al compilatore che stai esplicitamente ignorando il risultato dell'espressione.
È per questo motivo che la macro ANSI C standard assert ()
viene trasformata in ((void) 0)
quando viene definito NDEBUG
invece dell'istruzione vuota.