Frage

Ich möchte in einigen Pre-Prozessor-Makros codieren einige Informationen, um optional anmelden. Zum Beispiel in dem 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

in der .m ich umsetzen wie:

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

Der Code funktioniert gut, wie ich es dargestellt habe. Allerdings glaube ich nicht, mein „nichts tun“ Fall als leicht ist, wie es sein könnte. Ich hatte erwartet, zu schreiben:

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

Da ein einsames Semikolon ist eine gültige Ziel-c Aussage, erwartete ich das funktionieren würde, aber der Compiler sagt mir:

expected expression before ';' token

Meine Frage ist: Habe ich die leichtesten „nichts tun“ Aussage, durch 1==1 mit oder gibt es eine weniger intensive Art und Weise, dies zu tun. Oder vielleicht mein gesamte Ansatz auf temporäre Debug-Protokollierung ist verquer?

War es hilfreich?

Lösung

Die einfachste Sache ist eine leere Definition:

#define ML_DEBUG(x)

Dies funktioniert für die meisten Fälle, aber es mit dem ternären Operator nicht funktioniert, z.

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

Um diese (zugegebenermaßen erfundene) Beispiel funktioniert, können Sie dies tun:

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

Es ist durchaus gültig, die Dinge zu werfen ungültig zu erklären - sagt es den Compiler, die Sie explizit das Ergebnis des Ausdrucks sind ignorieren

.

Es ist aus diesem Grunde, dass der Standard-ANSI-C-Makro assert() in ((void)0) gedreht wird, wenn NDEBUG anstelle der leeren Anweisung definiert ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top