C Vorverarbeiter

Der C Vorverarbeiter oder cpp sind der Makrovorverarbeiter für den C und C ++ Computerprogrammiersprachen. Der Vorverarbeiter stellt die Fähigkeit zur Einschließung von Kopfball-Dateien, den Makrovergrößerungen, der bedingten Kompilation und der Linienkontrolle zur Verfügung.

In vielen C Durchführungen ist es ein getrenntes Programm, das durch den Bearbeiter als der erste Teil der Übersetzung angerufen ist.

Die Sprache von Vorverarbeiter-Direktiven ist Agnostiker zur Grammatik von C, so kann der C Vorverarbeiter auch unabhängig verwendet werden, um andere Arten von Textdateien zu bearbeiten.

Phasen

Die ersten vier (acht) Phasen der im C Standard angegebenen Übersetzung sind:

  1. Ersatz von Trigraph: Der Vorverarbeiter ersetzt trigraph Folgen durch die Charaktere, die sie vertreten.
  2. Das Linienverstärken: Physische Quelllinien, die mit entkommenen newline Folgen fortgesetzt werden, werden gesplissen, um logische Linien zu bilden.
  3. Tokenization: Der Vorverarbeiter bricht das Ergebnis in Aufbereitungsjetons und whitespace. Es ersetzt Anmerkungen durch whitespace.
  4. Makrovergrößerung und das lenkende Berühren: Lenkende Aufbereitungslinien, einschließlich der Dateieinschließung und bedingten Kompilation, werden durchgeführt. Der Vorverarbeiter breitet gleichzeitig Makros und in der 1999-Version des C Standards aus, behandelt Maschinenbediener.

Einschließlich Dateien

Einer des allgemeinsten Gebrauches des Vorverarbeiters soll eine andere Datei einschließen:

  1. einschließen

int Haupt(Leere)

{\

printf ("Hallo, Welt! \n");

kehren Sie 0 zurück;

}\

</Quelle>

Der Vorverarbeiter ersetzt die Linie durch den Text der Datei 'stdio.h', der die Funktion unter anderem erklärt.

Das kann auch mit Anführungszeichen z.B geschrieben werden. Wenn der Dateiname innerhalb von Winkelklammern eingeschlossen wird, wird nach der Datei im Standardbearbeiter gesucht schließen Pfade ein. Wenn der Dateiname innerhalb von Anführungszeichen eingeschlossen wird, wird der Suchweg ausgebreitet, um das aktuelle Quellverzeichnis einzuschließen. C Bearbeiter und Programmierumgebungen haben alle eine Möglichkeit, die dem Programmierer erlaubt zu definieren, wo Dateien einschließen, kann gefunden werden. Das kann durch eine Befehl-Linienfahne eingeführt werden, die mit einem makefile parametrisiert werden kann, so dass ein verschiedener Satz dessen Dateien einschließt, kann in für verschiedene Betriebssysteme zum Beispiel getauscht werden.

Durch die Tagung, schließen Sie Dateien ein werden eine.h Erweiterung gegeben, und durch andere nicht eingeschlossene Dateien werden eine.c Erweiterung gegeben. Jedoch gibt es keine Voraussetzung dass das beobachtet werden. Gelegentlich werden Sie Dateien mit anderen eingeschlossenen Erweiterungen sehen: Dateien mit einer.def Erweiterung können anzeigen, dass Dateien vorgehabt haben, mehrmals eingeschlossen zu werden, jedes Mal denselben wiederholenden Inhalt ausbreitend; wird sich wahrscheinlich auf eine XBM Bilddatei beziehen (der zur gleichen Zeit eine C Quelldatei ist).

häufig zwingt den Gebrauch von Wächtern oder doppelte Einschließung zu verhindern.

Bedingte Kompilation

und Direktiven kann für die bedingte Kompilation verwendet werden.

  1. wenn WORTREICH> = 2

Druck ("verfolgen Nachricht");

  1. endif
</Quelle>

Der grösste Teil des Bearbeiter-Zielens Windows von Microsoft definiert implizit. Das erlaubt Code einschließlich Vorverarbeiter-Befehle, zu kompilieren, wenn nur es Windows-Systeme ins Visier nimmt. Einige Bearbeiter definieren stattdessen. Für solche Bearbeiter, die das Makro nicht implizit definieren, kann es auf der Befehl-Linie des Bearbeiters, damit angegeben werden.

  1. ifdef __ unix __/* __ unix __ wird gewöhnlich durch das Bearbeiter-Zielen Systeme von Unix * / definiert
  2. einschließen
  3. elif hat _WIN32/* _Win32 definiert wird gewöhnlich durch Bearbeiter definiert, die 32 oder 64 Bit-Windows-Systeme * / ins Visier nehmen
einschließen endif</Quelle>

Der Beispiel-Code prüft, wenn ein Makro definiert wird. Wenn es ist, wird die Datei dann eingeschlossen. Sonst prüft es, wenn ein Makro stattdessen definiert wird. Wenn es ist, wird die Datei dann eingeschlossen.

Ein komplizierteres Beispiel kann Maschinenbediener, zum Beispiel etwas verwenden wie:

  1. wenn! (definiert __ LP64 __ definiert __ LLP64 __) hat _WIN32 && definiert! definierter _WIN64

//wir kompilieren für ein 32-Bit-System

  1. sonst

//wir kompilieren für ein 64-Bit-System

endif</Quelle>

Übersetzung kann auch veranlasst werden, durch das Verwenden der Direktive zu scheitern:

  1. wenn RUBY_VERSION == 190
  2. Fehler 1.9.0 nicht unterstützter
endif</Quelle>

Makrodefinition und Vergrößerung

Es gibt zwei Typen von Makros, einem Gegenstand ähnlich und funktionsähnlich. Einem Gegenstand ähnliche Makros nehmen Rahmen nicht; funktionsähnliche Makros tun. Die allgemeine Syntax, für einen Bezeichner als ein Makro jedes Typs zu erklären, ist beziehungsweise:

  1. definieren
definieren </Quelle>

Die funktionsähnliche Makrobehauptung muss keinen whitespace zwischen dem Bezeichner und dem ersten, der Öffnung, der Parenthese haben. Wenn whitespace da ist, wird das Makro als einem Gegenstand ähnlich mit allem interpretiert, von der ersten zur Scheinliste hinzugefügten Parenthese anfangend.

Eine Makrodefinition kann mit "#undef" entfernt werden:

  1. undef
</Quelle>

Wann auch immer der Bezeichner im Quellcode erscheint, wird es durch die Ersatzscheinliste ersetzt, die leer sein kann. Für einen Bezeichner, der erklärt ist, ein funktionsähnliches Makro zu sein, wird es nur ersetzt, wenn der folgende Jeton auch eine linke Parenthese ist, die die Argument-Liste der Makrobeschwörung beginnt. Das genaue Verfahren, das für die Vergrößerung von funktionsähnlichen Makros mit Argumenten gefolgt ist, ist fein.

Einem Gegenstand ähnliche Makros wurden als ein Teil der guten Programmierpraxis herkömmlich verwendet, um symbolische Namen für Konstanten z.B zu schaffen.

  1. definieren Sie PI 3.14159
</Quelle>

... statt des harten Codierens die Zahlen überall im Code. Eine Alternative sowohl in C als auch in C ++, besonders in Situationen, in denen ein Zeigestock zur Zahl erforderlich ist, soll den Qualifikator auf eine globale Variable anwenden. Das veranlasst den Wert, im Gedächtnis versorgt zu werden, anstatt durch den Vorverarbeiter eingesetzt zu werden.

Ein Beispiel eines funktionsähnlichen Makros ist:

  1. definieren Sie RADTODEG (x) ((x) * 57.29578)
</Quelle>

Das definiert eine radians zu Graden Konvertierung, die in den Code, wo erforderlich, eingefügt werden kann, d. h.. Das wird im Platz ausgebreitet, so dass die wiederholte Multiplikation durch die Konstante überall im Code nicht gezeigt wird. Das Makro hier wird als die ganze Großschrift geschrieben, um zu betonen, dass es ein Makro, nicht eine kompilierte Funktion ist. Der zweite x wird in seinem eigenen Paar von Parenthesen eingeschlossen, Berechnungen in der falschen Ordnung vermeidend, wenn ein Ausdruck statt eines einzelnen Werts passiert wird.

Bestimmte Symbole sind erforderlich, durch eine Durchführung während der Aufbereitung definiert zu werden. Diese schließen ein und, vorherbestimmt durch den Vorverarbeiter selbst, die sich in die aktuelle Datei und Linienzahl ausbreiten. Zum Beispiel der folgende:

//das Beseitigen bei Makros, so können wir unten Nachrichtenursprung mit einem flüchtigen Blick befestigen

  1. definieren Sie WHERESTR" [Datei %s, Linie %d]:"
  2. definieren Sie WHEREARG __ DATEI __, __ LINIE __
  3. definieren Sie DEBUGPRINT2 (...) fprintf (stderr, __ VA_ARGS __)
  4. definieren Sie DEBUGPRINT (_fmt...) DEBUGPRINT2 (WHERESTR _fmt, WHEREARG, __ VA_ARGS __)

//...

DEBUGPRINT ("he, x = % d\n", x);

</Quelle>

druckt den Wert, vorangegangen durch die Datei und Linienzahl zum Fehlerstrom, schnellen Zugang erlaubend, zu dem sich aufstellen, wurde die Nachricht darauf erzeugt. Bemerken Sie, dass das Argument mit der Schnur im Anschluss daran verkettet wird.

Der erste C Standard hat angegeben, dass das Makro zu 1 definiert wurde, wenn sich die Durchführung dem ISO Standard und 0 sonst, und das Makro anpasst, das als ein numerisches wörtliches Spezifizieren der Version des durch die Durchführung unterstützten Standards definiert ist. Standard C ++ Bearbeiter unterstützt das Makro. Bearbeiter, die in der Sonderweise laufen, müssen diese Makros nicht setzen, oder müssen andere definieren, um den Unterschieden Zeichen zu geben.

Andere Standardmakros, schließen das aktuelle Datum, und, die Uhrzeit ein.

Die zweite Ausgabe des C Standards, C99, hat Unterstützung dafür hinzugefügt, der den Namen der Funktionsdefinition enthält, innerhalb deren es enthalten wird, aber weil der Vorverarbeiter zur Grammatik von C ist, muss das im Bearbeiter selbst mit einem variablen Vorortszug an der Funktion getan werden.

Makros, die eine unterschiedliche Zahl von Argumenten nehmen können (variadic Makros) wird in C89 nicht erlaubt, aber wurde durch mehrere Bearbeiter eingeführt und in C99 standardisiert. Makros von Variadic sind besonders nützlich, wenn sie Streifbändern Funktionen schreiben, die eine variable Zahl von Rahmen, solcher als zum Beispiel nehmen, wenn sie Warnungen und Fehler loggen.

Ein wenig bekanntes Gebrauch-Muster des C Vorverarbeiters ist als "X-Makros" bekannt. Ein X-Macro ist eine Kopfball-Datei. Allgemein verwenden diese die Erweiterung ".def" statt des traditionellen ".h". Diese Datei enthält eine Liste von ähnlichen Makroanrufen, die "Teilmakros" genannt werden können. In der einschließen Datei wird dann wiederholt Verweise angebracht.

Viele Bearbeiter definieren zusätzlich, umgangssprachlich, Makros, obwohl diese häufig schlecht dokumentiert werden. Eine allgemeine Verweisung für diese Makros ist der Vorherbestimmte C/C ++ Bearbeiter-Makroprojekt, das "verschiedene vorherbestimmte Bearbeiter-Makros verzeichnet, die verwendet werden können, um Standards, Bearbeiter, Betriebssysteme, Hardware-Architekturen und sogar grundlegende Laufzeitbibliotheken während der Übersetzung zu identifizieren".

Scheinverkettung

## verkettet Maschinenbediener zwei Jetons in einen Jeton, als in diesem Beispiel:

  1. definieren Sie DECLARE_STRUCT_TYPE (Name) typedef struct name##_s
name##_t

DECLARE_STRUCT_TYPE (g_object);//Produktionen typedef struct g_object_s g_object_t;

</Quelle>

Benutzerbestimmte Kompilationsfehler

Die lenkenden Produktionen eine Nachricht durch den Fehlerstrom.

  1. Fehler "Fehlermeldung"
</Quelle>

Durchführungen

Mit dem Bearbeiter spezifische Vorverarbeiter-Eigenschaften

Die Direktive ist ein Bearbeiter spezifische Direktive, die Bearbeiter-Verkäufer zu ihren eigenen Zwecken verwenden können. Zum Beispiel, zu sein, der häufig verwendet ist, um Unterdrückung von spezifischen Fehlermeldungen zu erlauben, führen Sie Haufen und Stapel, der und so weiter die Fehler beseitigt.

C99 hat einige Standarddirektiven eingeführt, die Form annehmend, die verwendet werden, um die Schwimmpunkt-Durchführung zu kontrollieren.

  • Viele Durchführungen unterstützen trigraphs nicht oder ersetzen sie standardmäßig nicht.
  • Viele Durchführungen (einschließlich, z.B, die C-Bearbeiter durch GNU, Intel, Microsoft und IBM) stellen eine Sonderdirektive zur Verfügung, um eine Warnungsnachricht in der Produktion auszudrucken, aber den Kompilationsprozess nicht aufzuhören. Ein typischer Gebrauch soll über den Gebrauch von einem alten Code warnen, der jetzt missbilligt und nur aus Vereinbarkeitsgründen z.B eingeschlossen wird:

(GNU, Intel und IBM)

  1. Warnung "Verwendet Abc nicht, das missbilligt wird. Verwenden Sie XYZ stattdessen."
</Quelle>

(Microsoft)

  1. Pragma-Nachricht ("Verwenden Abc nicht, das missbilligt wird. Verwenden Sie XYZ stattdessen.")
</Quelle>
  • Einige Unix Vorverarbeiter haben traditionell "Behauptungen" zur Verfügung gestellt, die wenig Ähnlichkeit zu in der Programmierung verwendeten Behauptungen haben.
  • GCC sorgt für das Anketten von Kopfbällen desselben Namens.
  • Objektive-C Vorverarbeiter haben, der ähnlich ist, aber ist, nur schließt die Datei einmal ein.

Gebrauch

Als ein Mehrzweckvorverarbeiter (GPP)

Da der C Vorverarbeiter unabhängig angerufen werden kann, um Dateien außer denjenigen zu bearbeiten, die zukünftig kompilierten Quellcode enthalten, kann er auch als ein "allgemeiner Zweck-Vorverarbeiter" (GPP) für andere Typen der Textverarbeitung verwendet werden. Ein besonders bemerkenswertes Beispiel ist das jetzt missbilligte imake System.

GPP arbeitet wirklich annehmbar mit den meisten Zusammenbau-Sprachen. GNU erwähnt Zusammenbau als eine der Zielsprachen unter C, C ++ und Ziel-C in der Dokumentation seiner Durchführung des Vorverarbeiters. Das verlangt, dass die Assemblersyntax nicht die GPP Syntax kollidiert, was keine Linien bedeutet, die damit anfangen, und dass Anführungszeichen, die cpp als Schnur-Druckfehler interpretiert und so ignoriert, syntaktische Bedeutung außer dem nicht haben.

Jedoch, da der C Vorverarbeiter Eigenschaften einiger anderer Vorverarbeiter, wie rekursive Makros, auswählende Vergrößerung gemäß dem Bezug, der Schnur-Einschätzung in conditionals und der Vollständigkeit von Turing nicht hat, wird es im Vergleich mit einem allgemeineren Makroverarbeiter wie m4 sehr beschränkt.

Siehe auch

Außenverbindungen


Magnolie (Film) / Peter von Blois
Impressum & Datenschutz