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?
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?
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.
Es ist identisch mit dem Auskommentieren des Blocks, außer mit einem wichtigen Unterschied: Das Verschachteln ist kein Problem. Betrachten Sie diesen Code:
foo();
bar(x, y); /* x must not be NULL */
baz();
Wenn ich es auskommentieren möchte, könnte ich versuchen:
/*
foo();
bar(x, y); /* x must not be NULL */
baz();
*/
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 der baz
Aufruf nicht auskommentiert wird, und */
nach baz
einem Syntaxfehler. Andererseits:
#if 0
foo();
bar(x, y); /* x must not be NULL */
baz();
#endif
Funktioniert, um die ganze Sache zu kommentieren. Und die #if 0
s werden wie folgt miteinander nisten:
#if 0
pre_foo();
#if 0
foo();
bar(x, y); /* x must not be NULL */
baz();
#endif
quux();
#endif
Obwohl dies natürlich etwas verwirrend werden und zu Wartungsproblemen führen kann, wenn es nicht richtig kommentiert wird.
foo.c:3: unterminated string or character constant
von gcc, was benutzt du?
Was genau macht ein #if 0… #endif Block?
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…
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.
#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
:
#if 0
This code will not be compiled
#else
int i = 0;
#endif
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.
Nicht ganz
int main(void)
{
#if 0
the apostrophe ' causes a warning
#endif
return 0;
}
Es zeigt "tc: 4: 19: Warnung: fehlendes Abschlusszeichen" mit gcc 4.2.4
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:
#ifdef DEBUG
// output to file
#endif
Sie können so etwas tun, und es könnte sinnvoller sein. Sie müssen lediglich DEBUG definieren, um die Ergebnisse anzuzeigen.
//
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 .