Gemäß dem C-Sprachstandard müssen die Zeilen zwischen #if 0
und #endif
nur Vorverarbeitungstoken enthalten, so dass die meisten Arten von vollständig fehlerhafter Syntax, z. #foo
oder #include [bar]
sind erlaubt (stillschweigend ignoriert); GCC und Microsoft C ++ ignorieren diese tatsächlich stillschweigend.
Ein @
entspricht, soweit ich sehen kann, keinem Vorverarbeitungstoken, also sollte es immer noch ein Syntaxfehler sein. GCC und Microsoft C ++ ignorieren es stillschweigend. Ist das effektiv eine Spracherweiterung oder fehlt mir etwas?
Benutzt jemand tatsächlich die Fähigkeit, missgebildete Syntax zwischen #if 0
und #endif
in der Praxis zu setzen?
Sowohl der C- als auch der C ++ - Standard enthalten eine spezielle "Escape-Klausel" in ihrer Grammatik, die dafür sorgt, dass jedes Zeichen, das kein Leerzeichen ist, ein Vorverarbeitungstoken ist. Aus diesem Grund kann eine Verknüpfung zwischen #if 0
und #endif
fast nie einen Kompilierungsfehler verursachen. Die einzige Ausnahme sind nicht übereinstimmende Anführungszeichen für Zeichen- und Zeichenfolgenliterale.
Und ja, ich stelle regelmäßig eine fehlerhafte Syntax zwischen #if 0
und #endif
, um teilweise geschriebenen Code zu deaktivieren.
Der Präprozessor ist wie es klingt: Er verarbeitet Dateien vor (vor) dem Compiler. Die Eingabe, die der tatsächliche Compiler sieht, ist, was der Präprozessor ihm zuführt, und wenn ein Teil des Codes zwischen #if 0
und einem passenden #endif
liegt, dann sieht der Compiler diesen Code nicht einmal. Deshalb können Sie fast alles in diesen Abschnitt einfügen, der Compiler wird es einfach nicht sehen.
Der Code zwischen #if 0 und #endif wird nicht in den endgültigen Quellcode aufgenommen (nach der Ausgabe pro Prozessor). Wenn Sie Visual Studio verwenden und die Ausgabe des Vorprozessors anzeigen möchten, Gehe zur Projekteigenschaft - & gt; Wählen Sie C / C ++ - & gt; Wählen Sie Präprozessor - & gt; Wählen Sie "Ja" in der Vorverarbeitung für eine Dateioption.
Gehen Sie in Ihr Projektverzeichnis und Sie sehen die Datei ".i". Dies ist die Ausgabe Ihres Präprozessors.
Und Sie können sehen, Code zwischen #if 0 und #endif ist nicht enthalten. Also keine Frage des Fehlers.
Tags und Links c c++ c-preprocessor