Der Wikipedia-Artikel zum C-Präprozessor sagt:
Die Sprache der Präprozessordirektiven ist nur schwach mit der Grammatik von C verwandt und wird daher manchmal verwendet, um andere Arten von Textdateien zu verarbeiten.
Wie unterscheidet sich die Sprache eines Präprozessors von der C-Grammatik? Was sind die Vorteile? Wurde der C-Präprozessor für andere Sprachen / Zwecke verwendet?
Kann es verwendet werden, um zwischen Inline-Funktionen und Makros zu unterscheiden, da Inline-Funktionen die Syntax einer normalen C-Funktion haben, während Makros eine etwas andere Grammatik verwenden?
Der Wikipedia-Artikel ist keine wirklich maßgebliche Quelle für die C-Programmiersprache. Die C-Präprozessorgrammatik ist ein Teil von C Grammatik. Es unterscheidet sich jedoch vollständig von der Phrasenstrukturgrammatik dh diese 2 sind überhaupt nicht verwandt, außer dass sie beide verstehen, dass die Eingabe aus C-Sprachtoken besteht (obwohl der C-Präprozessor das Konzept von Vorverarbeitungsnummern , was bedeutet, dass etwas wie 123_abc
ein legales Vorverarbeitungstoken ist, aber kein gültiger Bezeichner ist.
Nachdem die Vorverarbeitung abgeschlossen ist und bevor die Übersetzung mit der Phrasenstrukturgrammatik begonnen hat (die Präprozessordirektiven wurden inzwischen entfernt und Makros erweitert usw.),
Jedes Vorverarbeitungstoken wird in ein Token konvertiert. ( C11 5.1.1.2p1 Punkt 7 )
Die Verwendung von C-Präprozessor für andere Sprachen ist wirklich missbrauchen . Der Grund dafür ist, dass der Präprozessor erfordert, dass die Datei aus geeigneten C-Vorverarbeitungstoken besteht. Es funktioniert nicht für andere andere Sprachen. Sogar C ++, mit seinen jüngsten Erweiterungen, wie rohen String-Literalen , kann nicht sein vorverarbeitet von einem C-Präprozessor!
Hier ist ein Auszug aus den Handbüchern cpp
(GNU C-Präprozessor) :
Der C-Präprozessor soll nur mit C, C ++ und Objective-C-Quellcode. In der Vergangenheit wurde es als General missbraucht Textprozessor. Es wird bei Eingaben ersticken, die nicht C's lexikalisch gehorchen Regeln. Zum Beispiel werden Apostrophe als Anfang von interpretiert Charakterkonstanten und verursachen Fehler. Außerdem können Sie sich nicht darauf verlassen Erhalt von Eigenschaften der Eingabe, die für nicht relevant sind C-Familiensprachen. Wenn ein Makefile vorverarbeitet wird, alle harten Tabs wird entfernt, und das Makefile wird nicht funktionieren.
Der Präprozessor erstellt Vorverarbeitungstoken, die später in C-Token konvertiert werden.
Im Allgemeinen ist die Konvertierung ziemlich direkt, aber nicht immer. Wenn Sie beispielsweise eine bedingte Vorverarbeitungsdirektive haben, die wie in
als falsch ausgewertet wird %Vor% dann in comments
Sie können schreiben, was Sie wollen, es wird in Vorverarbeitungstoken konvertiert, die niemals in C-Token konvertiert werden, so dass Sie innerhalb einer C-Quelldatei nicht-kommentierten Code einfügen können.
Die einzige Verbindung zwischen der Sprache des Präprozessors und C besteht darin, dass viele Token fast identisch, aber nicht immer definiert sind.
Zum Beispiel ist es zulässig, Präprozessornummern zu haben (im ISO9899-Standard pp-Nummern genannt) wie 4MD
, die gültige Präprozessornummern, aber keine gültigen C-Nummern sind. Mit dem Operator ## können Sie einen gültigen C-Bezeichner unter Verwendung dieser Vorverarbeitungsnummern erhalten. Zum Beispiel
Der Präprozessor wurde so konzipiert, dass er auf jede Sprache anwendbar ist, um eine Textübersetzung zu machen, ohne C im Kopf zu haben. In C ist es hauptsächlich nützlich, eine klare Trennung zwischen Schnittstellen und Implementierungen vorzunehmen.
Bedingungen im C-Präprozessor sind gültige C-Ausdrücke, so dass die Verbindung zwischen dem Präprozessor und der C-Sprache intim ist.
%Vor%Dies erweitert sich zu bedeutungslosem C, kann aber bedeutungsvoller Text sein.
Hier ist eine 6
Obwohl der ausgegebene Text C ungültig ist, verwendet der Präprozessor Merkmale von C, um die korrekten bedingten Zeilen zu erweitern. Der C-Standard definiert dies in Form des konstanten Ausdrucks:
Aus dem C99-Standard §6.6 :
6.10.1 Bedingte Aufnahme
Vorverarbeitungsrichtlinien der Formulare
# if constant-expression new-line group opt
# elif constant-expression new-line group opt
Überprüfen Sie, ob der kontrollierende konstante Ausdruck einen Wert ungleich Null ergibt.
Und hier ist die Definition eines konstanten Ausdrucks
6.6 Konstante Ausdrücke
Syntax:
%Vor%Beschreibung Ein konstanter Ausdruck kann während der Übersetzung und nicht in der Laufzeit ausgewertet werden und kann daher in jedem verwendet werden Stelle, dass eine Konstante sein kann.
Abhängigkeiten Konstante Ausdrücke dürfen keine Zuweisungs-, Inkrement-, Dekrement-, Funktionsaufruf- oder Kommaoperatoren enthalten, außer wenn Sie sind in einem Teilausdruck enthalten, der nicht ausgewertet wird.
Jeder konstante Ausdruck muss zu einer Konstante ausgewertet werden, die in der Bereich von darstellbaren Werten für seinen Typ.
Angesichts der obigen Ausführungen ist es klar, dass der Präprozessor eine eingeschränkte Form der Ausdruckauswertung der C-Sprache benötigt, um zu funktionieren, und daher Kenntnisse der C-Typsystem-, Grammatik- und Ausdruckssemantik.
Tags und Links c c-preprocessor