Was bedeutet es, dass die Sprache der Präprozessordirektiven schwach mit der Grammatik von C verwandt ist?

8

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?

    
Neeraj Lohia 27.07.2017, 07:49
quelle

3 Antworten

23

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.

    
Antti Haapala 27.07.2017, 07:59
quelle
2

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

%Vor%

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.

    
alinsoar 27.07.2017 09:31
quelle
0

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.

    
user8376852 27.07.2017 14:24
quelle

Tags und Links