2016-05-12 7 views
-1

Ich bin kürzlich auf den Begriff "Multi-Pass-Compiler" gestoßen. Im Wesentlichen ist es jeder Compiler, der den Quellcode mit mehr als einem Durchlauf analysiert.Ist der C-Preprozessor Multi-Pass in Betrieb?

Also habe ich gedacht, ist der C-Pre-Prozessor Multi-Pass in Betrieb?

Sagen wir, ich habe den folgenden C-Code.

int bar = foo; 

#define foo 1 

Die einzige Möglichkeit, dies in den Pass funktionieren könnte durch, wenn der Präprozessor den ganzen Weg durch den Code ging Präprozessordirektiven gesucht und ging durch den Code dann wieder die Ersetzungen zu machen.

Funktioniert der Präprozessor so?

+3

Sie könnten, y'know, _test es out._ –

+0

@MattBall Die Frage wurde von einer C-ähnlichen Programmiersprache inspiriert, in der die Der obige Code ist gültig. – Izzo

+0

Es gibt * rescanning *, aber das passiert nur, wenn "rekursiv" ein Makro expandiert, es scannt nie weiter zurück über die aktuelle Erweiterung, die gerade verarbeitet wird. Also würde ich es nicht als Multipass bezeichnen. –

Antwort

6

Also habe ich gedacht, ist der C-Pre-Prozessor Multi-Pass in Betrieb?

Es muss nicht sein, und es ist in der Regel nicht.

int bar = foo; 

#define foo 1 

Ein Makro ist nur sichtbar, von dem Punkt seiner Definition (die #define Linie) an das Ende der Datei (oder zu einem entsprechenden #undef). In dem obigen ist die erste Zeile nicht ersetzt durch int bar = 1;; es bleibt vielmehr als int bar = foo;, was nur gültig ist, wenn bereits eine Deklaration von foo vorliegt. (Diese Erklärung würde durch die #define versteckt werden, sondern nur für Referenzen nach die Makrodefinition.)

Das Verhalten des Vorprozessors (genauer: die ersten mehrerer Übersetzungsphasen) ist so konzipiert, eine einzigen Durchlauf Implementierung zu ermöglichen, . Siehe den C-Standard (N1570 ist der aktuellste Entwurf) Abschnitt 5.1.1.2 für die Spezifikation. Der "Präprozessor" entspricht typischerweise den Phasen 1 bis 4 oder vielleicht 1 bis 5.

+0

Ah perfekt. Ich hatte im Hinterkopf, dass der Präprozessor ein Standardwerkzeug ist, aber ich nehme an, dass es abhängig von der Umgebung variieren kann. Ich habe zum Beispiel mit C wie Sprachen gearbeitet, die "globale Includes" enthalten, die eine Art Multi-Pass-Präprozessor implementiert haben müssen. – Izzo

+0

Der Präprozessor ist ein logischer Teil eines C- oder C++ - Compilers (er kann auch als eigenständiges Programm implementiert sein). Sein Verhalten ist durch den Sprachstandard definiert. Einige Aspekte seines Verhaltens, z. B. wo es nach Kopfzeilen sucht, die in '# include'-Direktiven benannt sind, sind implementierungsdefiniert. –

+0

@ M.M: Guter Punkt, Antwort aktualisiert. –