In C / C ++
Was passiert mit Code zwischen einem #if 0
/ #endif
Block?
#if 0
//Code goes here
#endif
Wird der Code einfach übersprungen und daher nicht ausgeführt?
c-preprocessor
vette982
quelle
quelle
//
oder den Abschnitt mit beginnen/*
und den Abschnitt mit beenden*/
. Das Problem bei letzteren Techniken ist, dass Kommentare nicht verschachtelt sind, sodass der Entwickler*/
zwischen Start und Ende prüfen und behandeln muss .Antworten:
Es wird nicht nur nicht ausgeführt, sondern auch nicht kompiliert.
#if
ist ein Präprozessorbefehl, der vor dem eigentlichen Kompilierungsschritt ausgewertet wird. Der Code in diesem Block wird nicht in der kompilierten Binärdatei angezeigt.Es wird häufig zum vorübergehenden Entfernen von Codesegmenten verwendet, um sie später wieder einzuschalten.
quelle
Es ist identisch mit dem Auskommentieren des Blocks, außer mit einem wichtigen Unterschied: Das Verschachteln ist kein Problem. Betrachten Sie diesen Code:
Wenn ich es auskommentieren möchte, könnte ich versuchen:
Bzzt. Syntax-Fehler! Warum? Da Blockkommentare nicht verschachtelt sind, wird (wie Sie anhand der Syntaxhervorhebung von SO sehen können)
*/
der Kommentar nach dem Wort "NULL" beendet, wodurch derbaz
Aufruf nicht auskommentiert wird, und*/
nachbaz
einem Syntaxfehler. Andererseits:Funktioniert, um die ganze Sache zu kommentieren. Und die
#if 0
s werden wie folgt miteinander nisten:Obwohl dies natürlich etwas verwirrend werden und zu Wartungsproblemen führen kann, wenn es nicht richtig kommentiert wird.
quelle
foo.c:3: unterminated string or character constant
von gcc, was benutzt du?Dieser Code wird permanent auskommentiert, sodass der Compiler ihn niemals kompiliert.
Der Codierer kann später das #ifdef ändern, damit dieser Code im Programm kompiliert wird, wenn er möchte.
Es ist genau so, als ob der Code nicht existiert.
quelle
Es sagt Ihnen, dass der Autor offensichtlich noch nie von einem Versionskontrollsystem gehört hat. Was Ihnen wiederum sagt, dass Sie so weit wie möglich weglaufen sollen…
quelle
Ich möchte für den
#else
Fall hinzufügen :quelle
Wenn der Präprozessor #if sieht, prüft er, ob das nächste Token einen Wert ungleich Null hat. Wenn dies der Fall ist, bleibt der Code für den Compiler erhalten. Wenn dies nicht der Fall ist, wird dieser Code entfernt, sodass der Compiler ihn nie sieht.
Wenn jemand #if 0 sagt, kommentiert er den Code effektiv aus, sodass er niemals kompiliert wird. Sie können sich das genauso vorstellen, als hätten sie / * ... * / darum gelegt. Es ist nicht ganz dasselbe, aber es hat den gleichen Effekt.
Wenn Sie verstehen möchten, was im Detail passiert ist, können Sie oft nachsehen. Bei vielen Compilern können Sie die Dateien anzeigen, nachdem der Präprozessor ausgeführt wurde. In Visual C ++ führt der Befehl switch / P beispielsweise den Präprozessor aus und speichert die Ergebnisse in einer .i-Datei.
quelle
#if WIN32 || __CYGWIN__
aber dies funktioniert wie erwartet.Zeilen, die mit a beginnen,
#
sind Präprozessoranweisungen .#if 0 [...] #endif
Blöcke schaffen es nicht zum Compiler und generieren keinen Maschinencode.Sie können anhand einer Quelldatei demonstrieren, was mit dem Präprozessor passiert
ifdef.cxx
:Laufen
gcc -E ifdef.cxx
zeigt Ihnen, was kompiliert wird.Sie können diesen Mechanismus verwenden, um zu verhindern, dass ein Codeblock während des Entwicklungszyklus kompiliert wird, aber Sie möchten ihn wahrscheinlich nicht in Ihre Quellcodeverwaltung einchecken, da er Ihrem Code nur Cruft hinzufügt und die Lesbarkeit verringert. Wenn es sich um einen historischen Code handelt, der auskommentiert wurde, sollte er entfernt werden: Die Quellcodeverwaltung enthält den Verlauf, oder?
Auch die Antwort mag für C und C ++ gleich sein, aber es gibt keine Sprache namens C / C ++ und es ist keine gute Angewohnheit, sich auf eine solche Sprache zu beziehen.
quelle
Nicht ganz
Es zeigt "tc: 4: 19: Warnung: fehlendes Abschlusszeichen" mit gcc 4.2.4
quelle
Es ist eine billige Möglichkeit, Kommentare abzugeben, aber ich vermute, dass dies ein Debugging-Potenzial haben könnte. Angenommen, Sie haben einen Build, der Werte in eine Datei ausgibt. Möglicherweise möchten Sie dies nicht in einer endgültigen Version, sodass Sie #if 0 ... #endif verwenden können.
Ich vermute auch, dass ein besserer Weg, dies zu Debug-Zwecken zu tun, darin besteht, Folgendes zu tun:
Sie können so etwas tun, und es könnte sinnvoller sein. Sie müssen lediglich DEBUG definieren, um die Ergebnisse anzuzeigen.
quelle