it-swarm.com.de

#ifdef DEBUG versus #if DEBUG

Bei der Verwendung von Compiler-Direktiven ist mir unklar, welcher der beiden folgenden Code-Schnipsel korrekt/bevorzugt ist und warum. Es scheint, dass die meisten Entwickler und Open Source-Projekte, die ich gesehen habe, das erste verwenden, aber ich habe das zweite gesehen, das auch häufig verwendet wird.

#ifdef DEBUG
[self doSomethingOnlyWhenDebugging];
#endif

VERSUS

#if DEBUG
[self doSomethingOnlyWhenDebugging];
#endif

Welches der obigen Codefragmente ist für die Ausführung von Code nur während des Debuggens vorzuziehen und warum? Ich vermute, dass die erste ausgeführt wird, wenn DEBUG als WAHR oder FALSCH definiert ist, wobei die zweite nur ausgeführt wird, wenn DEBUG definiert und auf WAHR gesetzt ist. Ist das korrekt?

49
lidsinker

Du hast Recht. #if DEBUG Wird nicht ausgewertet, wenn DEBUG als 0 Definiert ist.

Was den Verwendungszeitpunkt betrifft, können Sie bei der Verwendung von #ifdef Bleiben, wenn Sie nur add Code benötigen, wenn die Präprozessordefinition vorhanden ist, z. B. das Hinzufügen der Debug-Protokollierung. Wenn Sie den Wert überprüfen und verschiedene Kompilierungspfade durchgehen müssen, würde ich einen 0 Oder 1 Verwenden. Ein gutes Beispiel hierfür ist TARGET_IPHONE_SIMULATOR, Das immer für ein iOS-Projekt definiert ist, aber nur dann 1, Wenn Sie für den Simulator kompilieren.

39
Jeff Kelley

Wie ich weiß, ist die beste Wahl:

#ifndef DEBUG
    NSLog(@"-1");
#Elif DEBUG == 0
    NSLog(@"0");
#else
    NSLog(@"%d", DEBUG);
#endif

dann wirst du wissen #ifndef DEBUG ist vor allen anderen bevorzugt. Es gibt eine einfachere Wahl:

#if DEBUG == 0 // DEBUG is not defined or defined to be 0
    // do sth
#else
    // do sth
#endif

Wenn jedoch das Compiler-Flag - Wundef aktiviert ist, wird möglicherweise ein Warnung mit #if DEBUG == 0.

7
DawnSong

Sie müssen sich den Code ansehen, in dem DEBUG definiert oder nicht definiert wird, und Ihren Code entsprechend schreiben. Mit DEBUG werden Sie feststellen, dass es entweder nicht definiert oder mit einem Wert von 1 definiert ist. Also entweder #if DEBUG oder #ifdef DEBUG wird funktionieren.

Zum #define 's, die unter Ihrer Kontrolle stehen, sollten Sie immer definieren, entweder mit einem Wert von 0 oder 1. Sie können dann #if, um nach dem Wert zu suchen, aber Sie können sie auch direkt in einer gewöhnlichen if-Anweisung oder in einem Ausdruck verwenden, wodurch Ihr Code möglicherweise besser lesbar wird. Und da es immer definiert ist, können Sie "Gehe zu Definition" in Xcode verwenden, um zu der Stelle zu gelangen, an der es definiert ist, und um zu überprüfen, wie und warum es festgelegt wurde. Wenn Sie stattdessen entweder #define oder nicht #define der Wert, und es ist nicht definiert, dann hat Xcode keine Ahnung, wo in Ihrem Quellcode es nicht definiert ist. Sie können auch nach falsch geschriebenen Verwendungen suchen. Wenn "Zur Definition springen" nicht funktioniert, wissen Sie, dass Sie es falsch geschrieben haben.

Übrigens innerhalb eines #if Direktive, jedes nicht definierte Makro wird durch 0 ersetzt. Also #if DEBUG funktioniert, wenn DEBUG nicht definiert ist, oder wenn DEBUG als 0 definiert ist, und es wird nicht kompiliert, wenn DEBUG als nichts definiert ist - was Ihnen sagt, was falsch ist, damit Sie es beheben können. Aus dieser Sicht mit #if ist besser, wenn es nicht kompiliert.

2
gnasher729