Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

Erweiterungen gegenüber ANSI-/ISO-C

&pagelevel(4)&pagelevel

Die Verwendung nicht ANSI-/ISO-konformer Sprachfeatures, wozu die im Folgenden beschriebenen Erweiterungen zählen, führt zu potenziell nicht portablen Quellprogrammen.

Sonderzeichen $ und @ in Bezeichnern

Standardmäßig sind das Dollarzeichen $ bzw. das at-Zeichen @ in internen und externen Namen zugelassen. Dies kann durch Optionen unterdrückt werden (siehe „Bezeichner“ (Implementierungsabhängiges Verhalten gemäß dem ANSI-/ISO-C-Standard)).

main-Funktion mit drei Parametern

Zusätzlich zu den Parametern argc und argv (siehe „main-Funktion" (Implementierungsabhängiges Verhalten gemäß dem ANSI-/ISO-C-Standard)) kann ein dritter Parameter char *envp[] vereinbart werden. envp ist ein Zeiger auf einen Vektor von Zeichenketten, der mit Informationen zur Systemumgebung versorgt wird. Weitere Einzelheiten hierzu finden Sie im Handbuch „C-Bibliotheksfunktionen für POSIX-Anwendungen“ [3].

Gültigkeitsbereich von Funktionen

extern-Deklarationen von Funktionen innerhalb von Blöcken gelten für die gesamte Übersetzungseinheit. Wenn mehrere extern-Deklarationen für die gleiche Funktion vorliegen, werden sie auf Übereinstimmung überprüft.

Schreibzugriff auf Zeichenketten-Literale

Zeichenketten-Literale sind in dieser Implementierung standardmäßig überschreibbar. Dabei ist sichergestellt, dass sich die Literale nicht überlappen. Identische Literale werden in separaten Bereichen abgespeichert.
Bei Angabe der Optionen -K rostr bzw. STRING-LITERALS=*READ-ONLY kann auf Zeichenketten-Literale nur lesend zugegriffen werden.

Konvertierung von Funktions-Zeigern

Es ist erlaubt, mit dem cast-Operator Zeiger auf Objekte in Zeiger auf Funktionen sowie Zeiger auf Funktionen in Zeiger auf Objekte umzuwandeln. Bei impliziten Umwandlungen gibt der Compiler Warnungsmeldungen aus.

Nicht-Integer Bitfelder

Es können alle Integral-Typen als Bitfelder verwendet werden (siehe auch „Bitfelder“ (Implementierungsabhängiges Verhalten gemäß dem ANSI-/ISO-C-Standard)). Der Standard definiert lediglich die Typen int, unsigned int und signed int.

Schlüsselwort asm

Das Schlüsselwort asm ist im K&R-Modus und im erweiterten C-Modus reserviert. Da die Inline-Generierung von Assembler-Code jedoch nicht unterstützt wird, führt eine Anwendung dieses Schlüsselworts zu einem Fehler. Im strikten C-Modus ist asm nicht reserviert.

Mehrfachdefinitionen von externen Variablen

Wenn in mehreren Übersetzungseinheiten sog. „tentative“ Definitionen für dasselbe Objekt vorliegen (dies sind externe Deklarationen von Variablen ohne das Attribut extern oder static), müssen diese immer vom selben Typ sein. Unterschiedliche Typ-Deklarationen für dasselbe externe Objekt werden vom Compiler nicht erkannt. Mehrere Initialisierungen von externen Variablen führen zu Fehlern beim Binden. Dieses Verhalten lässt sich mit Optionen steuern (-K external_multiple, -K external_unique bzw. EXTERNAL-DEFINITION=*UNIQUE/*MULTIPLY-ALLOWED).

Leere Makro-Argumente

Bei dem Aufruf von Makros können auch leere Argumente übergeben werden.

Beispiel

#define F(a,b)   f(a)+f(b);
F(1)    /* ergibt f(1)+f(); */
F(,1)   /* ergibt f()+f(1); */

Vordefinierte Makros

Es sind einige Präprozessor-Makros aus Kompatibilitätsgründen vordefiniert, die nicht mit dem Unterstrich (_) beginnen (siehe „Vordefinierte Präprozessornamen“).

Zusätzliche Präprozessor-Anweisungen

Folgende Präprozessor-Anweisungen werden vom Compiler zusätzlich akzeptiert: #line (altes Format), #ident, #assert und #unassert.

#line-Anweisung (altes Format):

# Ziffern-Folge [Include-Datei]

Diese Anweisung ist gleichbedeutend mit der #line-Anweisung; es fehlt lediglich das Schlüsselwort line.

#ident-Anweisung:

#ident "zeichenkette"

Die #ident-Anweisung wird, wie auch die Anweisung #pragma ident, syntaktisch akzeptiert, führt jedoch zu keiner Veränderung im erzeugten Objekt. Der Compiler gibt keine Notes oder Warnings aus, da diese Anweisungen intern in System-Headern benutzt werden.

#assert-Anweisung:

#assert name[(token-Folge)]

Mit der #assert-Anweisung kann ein Prädikat (Assertion) definiert werden. Prädikate sind unabhängig von Makrodefinitionen.

name ist der Name des Prädikats. token-Folge ist der Wert, für den das Prädikat gilt.
Ein einzelnes token kann eines der folgenden lexikalischen Einheiten sein: Name, Schlüsselwort, Konstante, Zeichenkette, Operator, Trenn-/Interpunktionszeichen. Ist keine token-Folge angegeben, gilt wie bei einer symbolischen Konstante das Prädikat als definiert, allerdings ist kein Wert zugeordnet.

Mit der #if-Anweisung kann geprüft werden, ob ein Prädikat für einen Wert gilt:

#if #name(nicht-leere-token-Folge)

name ist der Name des Prädikats. nicht-leere-token-Folge ist der Wert, der überprüft werden soll. Beispielsweise würde die folgende Abfrage des vordefinierten Prädikats compiler die Bedingung „wahr“ liefern:

#if #system(bs2000)

Die vordefinierten Prädikate finden Sie im Anhang unter „Vordefinierte Präprozessor-Prädikate (#assert)“ (Vordefinierte Präprozessornamen).

#unassert-Anweisung:

#unassert name[(token-Folge)]

Ein Prädikat kann mit der #unassert-Anweisung wieder gelöscht werden. Die #unassert-Anweisung hat dieselbe Syntax wie die #assert-Anweisung.
Ist eine token-Folge angegeben, wird nur für diesen Wert das Prädikat gelöscht. Ist keine token-Folge angegeben, wird das Prädikat insgesamt gelöscht.