Was genau kannst du nach #if 0 setzen?

8

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?

    
rwallace 07.01.2013, 11:11
quelle

3 Antworten

13

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.

    
Bart van Ingen Schenau 07.01.2013, 11:31
quelle
2

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.

    
Some programmer dude 07.01.2013 11:31
quelle
1

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.

    
Pranit P Kothari 07.01.2013 11:51
quelle

Tags und Links