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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top