Befehl "cpp"

Zweck

Führt den Dateieinschluss und die Makrosubstitution in Quelldateien der Programmiersprache C durch.

Syntax

/usr/ccs/lib/cpp [ -C ] [ -P ] [ -qDBCS ] [ -IVerzeichnis ] [ -UName ] [ -DName [=Definition ]] [ -qlanglvl=Sprache ] [ InFile ] [ OutFile ]

Beschreibung

Der Befehl cpp führt den Dateieinschluss und die Makrosubstitution in Quellendateien der Programmiersprache C durch. Er liest die Eingabedatei und schreibt in die Ausgabedatei (standardmäßig Standardeingabe und Standardausgabe).

Der Befehl cpp ist so konzipiert, dass er den Vorverarbeitungsanweisungen und -instruktionen für die Programmiersprache C entspricht, die im Dokument "Draft American National Standard for Information Systems - Programming Language C" (X3J11/88-159) definiert sind.

Das Programm cpp erkennt die folgenden Sondernamen:

Element Beschreibung
__LINE__ Die aktuelle Zeilennummer.
__DATUM__ Das Datum der Konvertierung der Quellendatei.
__ZEIT__ Die Uhrzeit der Konvertierung der Quellendatei.
__STDC__ Zeigt eine konforme Implementierung an.
__DATEI__ Der aktuelle Dateiname.
__STR__ Gibt an, dass der Compiler Inline-Code für bestimmte Zeichenfolgefunktionen generiert (gemäß Definition in der Datei /usr/include/string.h).
__MATH__ Gibt an, dass der Compiler Inline-Code für bestimmte mathematische Funktionen generiert (gemäß Definition in der Datei /usr/include/math.h).
__ANSI__ Gibt an, dass langlvl auf ANSI gesetzt ist.
__SAA__ Gibt an, dass langlvl auf SAAgesetzt ist.
__SAA_L2__ Gibt an, dass langlvl auf SAAL2 gesetzt ist.
__ERWEITERT__ Gibt an, dass langlvl auf "extended" gesetzt ist.
__ZEITSTEMPEL__ Gibt das Datum und die Uhrzeit der letzten Änderung der Quellendatei an.

Alle cpp-Anweisungszeilen müssen mit einem Nummernzeichen (#) beginnen. Die folgenden Anweisungen sind verfügbar:

Element Beschreibung
#define Name TokenString Ersetzt nachfolgende Instanzen von Name durch Tokenzeichenfolge.
#define Name(Argument, ...,Argument) TokenString Ersetzt nachfolgende Instanzen der Folge Name (Argument, . . . ,Argument) durch Tokenzeichenfolge, wobei jedes Vorkommen eines Arguments in der Tokenzeichenfolge durch das entsprechende Token in der durch Kommas getrennten Liste ersetzt wird. Beachten Sie, dass zwischen Name und der linken runden Klammer kein Leerzeichen stehen darf.
#undef Name Ignoriert die Definition von Name ab diesem Punkt.
#include "Datei" oder #include <Datei> Schließt an diesem Punkt den Inhalt von Datei ein, der dann von cpp verarbeitet wird.

Wenn Sie Datei in doppelte Anführungszeichen (" ") einschließen, sucht der Befehl cpp zuerst im Verzeichnis von Eingabedatei, dann in den mit dem Flag -I angegebenen Verzeichnissen und zum Schluss in den Verzeichnissen in einer Standardliste.

Wenn Sie die Notation <Datei> verwenden, sucht der Befehl cpp nur in den Standardverzeichnissen nach Datei . Er sucht nicht in dem Verzeichnis, in dem sich Eingabedatei befindet.

#line Zahl ["Datei"] Bewirkt, dass sich die Implementierung so verhält, als begänne die folgende Folge von Quellenzeilen mit einer Quellenzeile, die die mit Nummer angegebene Zeilennummer hat. Wenn Datei angegeben ist, wird der vermutliche Name der Datei in Datei geändert.
#Fehler TokenString Erzeugt eine Diagnosenachricht, die die Tokenzeichenfolge enthält.
#pragma TokenString Eine implementierungsspezifische Instruktion für den Compiler.
#endif Beendet einen Abschnitt von Zeilen, der mit einer Testanweisung (#if, #ifdef oder #ifndef) begonnen wurde. Jede Testanweisung muss eine entsprechende Anweisung #endif haben.
#ifdef Name Schreibt die nachfolgenden Zeilen nur dann in die Ausgabe, wenn:

Name mit einer vorherigen Anweisung #define definiert wurde

ODER

Name mit dem Flag -D- definiert wurde

ODER

Name ein Sondername ist, der vom Befehl cpp erkannt wird

UND

die Definition von Name nicht durch eine dazwischen eingefügte Anweisung #undef aufgehoben wurde

ODER

die Definition von Name nicht mit dem Flag -U aufgehoben wurde.

#ifndef Name Schreibt die nachfolgenden Zeilen nur dann in die Ausgabe, wenn:

Name noch mit keiner früheren Anweisung #define wurde

UND

Name kein Sondername ist, der vom Befehl cpp erkannt wird

ODER

Name mit einer früheren Anweisung #define definiert wurde, aber die Definition dann mit einer dazwischen eingefügten Anweisung #undef aufgehoben wurde

ODER

Name ein Sondername ist, der vom Befehl cpp erkannt wird, dessen Definition aber mit dem Flag -U aufgehoben wurde.

#if Ausdruck Schreibt die nachfolgenden Zeilen nur dann in die Ausgabe, wenn der Ausdruck mit einem Wert ungleich Null ausgewertet wird. Alle binären Nicht-Zuordnungs-C-Operatoren, die?: Operator und die monadischen Operatoren-,!-und-sind in Ausdruckzulässig. Die Rangfolge der Operatoren entspricht der in der Programmiersprache C definierten Rangfolge. Es gibt auch den monadischen Operator defined, der im Ausdruck in den folgenden beiden Formen verwendet werden kann:
defined (Name) oder defined Name
Dieser Operator ermöglicht die Verwendung von #ifdef und #ifndef in einer #if--Anweisung. Nur diese Operatoren, ganzzahlige Konstanten und Namen, die dem Befehl cpp bekannt sind, dürfen im Ausdruck verwendet werden. Der Operator sizeof ist nicht verfügbar.
#elif Ausdruck Schreibt die nachfolgenden Zeilen nur dann in die Ausgabe, wenn der Ausdruck in der vorhergehenden #if- oder #elif-Anweisung mit "false" ausgewertet oder die Ausdrucksdefinition aufhoben wird und dieser Ausdruck mit "true" ausgewertet wird.
#else Schreibt die nachfolgenden Zeilen nur dann in die Ausgabe, wenn der Ausdruck in der vorhergehenden #if- oder #elif-Anweisung mit "false" ausgewertet oder die Ausdrucksdefinition aufgehoben wird (und die Zeilen nach #if und vor #else somit ignoriert wurden).

Die Bedingungen der einzelnen Testanweisen werden nacheinander überprüft. Wenn eine Bedingung mit "false" (0) ausgewertet wird, wird die entsprechende gesteuerte Gruppe übersprungen. Anweisungen werden nur über den Namen verarbeitet, der die Anweisung bestimmt, um die Ebene der verschachtelten Bedingungen verfolgen zu können. Die verbleibenden Vorverarbeitungstoken der Anweisungen werden ebenso wie die anderen Vorverarbeitungstoken in der Gruppe ignoriert. Nur die erste Gruppe, deren Steuerbedingung mit "true" (ungleich null) ausgewertet wird, wird verarbeitet. Wenn keine der Bedingungen mit "true" ausgewertet wird und es eine #else-Anweisung gibt, wird die mit #else gesteuerte Gruppe verarbeitet. Wenn es keine Anweisung #else gibt, werden alle Gruppen bis #endif übersprungen.

Flags

Element Beschreibung
-C Kopiert Kommentare in der Programmiersprache C aus der Quellendatei in die Ausgabedatei. Wenn Sie dieses Flag nicht angeben, entfernt der Befehl cpp alle Kommentare in der Programmiersprache C mit Ausnahme derer in einer cpp-Anweisungszeile.
- DName [ = Definition ] Definiert Name wie in einer #define-Anweisung. Die Standarddefinition ist 1.
-IVerzeichnis Sucht zuerst im angegebenen Verzeichnis und dann in den Verzeichnissen in der Standardliste nach #include-Dateien mit Namen, die nicht mit einem Schrägstrich (/) beginnen. Weitere Informationen finden Sie in der vorherigen Erläuterung von #include.
-P Führt eine Vorverarbeitung der Eingabe durch, ohne Zeilensteuerinformationen für den nächsten Durchlauf des C-Compilers zu erzeugen.
- qDBCS Gibt den Doppelbytezeichensatzmodus an.
- UName Entfernt alle ursprünglichen Definitionen von Name, wobei Name ein vom Vorprozessor vordefiniertes Symbol ist (mit Ausnahme der vier Anzeiger für den Vorprozessormodus: __ANSI__, __EXTENDED__, __SAA__und __SAA_L2__). Dieses Flag wird im ANSI-Modus nicht erkannt.
-qlanglvl=Sprache Wählt eine Sprachebene für die Verarbeitung aus. Sprache kann ANSI, SAA, SAAL2oder erweitert sein. Der Standardwert ist extended.

Anmerkung: Wenn Sie den Wert extended für Sprache verwenden, wird _NO_PROTO nicht automatisch definiert. Diese Definition können Sie mit der Option -D in der Datei /etc/xlc.cfg vornehmen.

Beispiele

  1. Geben Sie Folgendes ein, um den Text anzuzeigen, den der Vorprozessor an den C-Compiler sendet:
    /usr/ccs/lib/cpp pgm.c
    Diese Vorverarbeitungpgm.cund zeigt den resultierenden Text auf der Workstation an. Die Anzeige der Vorprozessorausgabe kann hilfreich sein, wenn Sie nach Fehlern in Ihren Makrodefinitionen suchen.
  2. Geben Sie Folgendes ein, um eine Datei mit besser lesbarem vorverarbeitetem Text zu erstellen:
    /usr/ccs/lib/cpp -P -C pgm.c pgm.i
    Diese Vorverarbeitungpgm.cund speichert das Ergebnis inpgm.i. Es übergeht Zeilennummerierungsinformationen für den C-Compiler (-P) und enthält Programmkommentare (-C).
  3. Geben Sie Folgendes ein, um Makro-IDs vorzudefinieren:
    /usr/ccs/lib/cpp -DBUFFERSIZE=512 -DDEBUG 
    pgm.c 
    pgm.i
    Dies definiertBUFFERSIZEmit dem Wert512undDEBUGmit dem Wert1vor der Vorverarbeitung.
  4. Geben Sie Folgendes ein, um #include -Dateien zu verwenden, die sich in vom Standard abweichenden Verzeichnissen befinden:
    /usr/ccs/lib/cpp -I/home/jim/include 
    pgm.c
    Daraufhin wird im aktuellen Verzeichnis nach #include -Dateien in Anführungszeichen gesucht./home/jim/includeund dann in den Standardverzeichnissen. Es sieht in/home/jim/includefür #include -Dateien mit Winkelzeichen (< >) und dann in den Standardverzeichnissen.
  5. Geben Sie Folgendes ein, um die ANSI-Definition vorzuverarbeiten:
    /usr/ccs/lib/cpp -qlanglvl=ansi pgm.c

Dateien

Element Beschreibung
/usr/include Standardverzeichnis für #include-Dateien.