Preprocessor Debug-Makro für optionale Protokollierung
-
05-07-2019 - |
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?
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.