Your Browser is not longer supported

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

{{viewport.spaceProperty.prod}}

Die C-Sprachmodi im Überblick

&pagelevel(3)&pagelevel

Der Compiler hat fünf C-Übersetzungsmodi, die sich an unterschiedlichen Sprachstandards orientieren:

K&R-C-Modus (POSIX-Option -X kr, SDF-Option MODE=KERNIGHAN-RITCHIE)

Der Compiler akzeptiert C-Code gemäß der Definition von Kernighan/Ritchie einschließlich einiger ANSI-spezifischer Erweiterungen.

erweiterter C89-Modus (POSIX-Option -X 1990 -X nostrict, SDF-Option MODE=1990, STRICT=NO)

Der Compiler akzeptiert C-Code gemäß der ANSI-C89 Definition bzw. dem ISO C Standard von 1990 (inklusive des ISO-C Amendments 1) im erweiterten Modus.

strikter C89-Modus (POSIX-Option -X 1990 -X strict, SDF-Option MODE=1990, STRICT=YES)

Der Compiler akzeptiert C-Code gemäß der ANSI-C89 Definition bzw. dem ISO C Standard von 1990 (inklusive des ISO-C Amendments 1) im strikten Modus.

erweiterter C11-Modus (POSIX-Option -X 2011 -X nostrict, SDF-Option MODE=2011, STRICT=NO)

Der Compiler akzeptiert C-Code gemäß dem ISO C Standard von 2011 im erweiterten Modus.

strikter C11-Modus (POSIX-Option -X 2011 -X strict, SDF-Option MODE=2011, STRICT=YES)

Der Compiler akzeptiert C-Code gemäß dem ISO C Standard von 2011 im strikten Modus.

Folgende Tabelle gibt einen Überblick über die im jeweiligen ANSI-/ISO-C-Standard definierten Sprachelemente sowie über die in den Übersetzungsmodi unterstützten Sprachelemente.

Die Tabelleneinträge bedeuten:

X

Volle Unterstützung im strikten und im erweiterten Sprachmodus

o

nur syntaktische, keine semantische Unterstützung

-keine Unterstützung

 

Lexikalische Elemente

C Sprachelemente

Sprachdefinition

Übersetzungs-Modus

C11

C89

K&R

C11

C89

K&R

Multibytezeichen

X

X

-

X

X

X

Trigraph-Sequenzen

??=   #
??(   [
??/   \
??)   ]
??’   ^
??<   {
??!   |
??>   }
??-   ~

X

X

-

X

X

X

Digraph-Sequenzen 1)

<:    [
:>    ]
<%    {
%>    }
%:    #
%:%:  ##

X

X

-

X

X

X

Escape-Sequenzen

\a

X

X

-

X

X

-

\b

X

X

X

X

X

X

\e, \E

-

-

-

X

X

X

\f

X

X

X

X

X

X

\n

X

X

X

X

X

X

\r

X

X

X

X

X

X

\t

X

X

X

X

X

X

\v

X

X

-

X

X

X

\

X

X

X

X

X

X

\"

X

X

-

X

X

X

\?

X

X

-

X

X

X

\\

X

X

X

X

X

X

\ octdigits

X

X

X

X

X

X

\u decdigits

\U decdigits

X

-

-

X

-

-

\x hexdigits

X

X

-

X

X

X

Namenslängen

intern

63

31

8

alle Zeichen signifikant

extern

31

6

<8

30/32/32K 2)

Schlüsselwörter 3)

Konstanten

integer

X

X

X

X

X

X

float

X

X

X

X

X

X

character

X

X

X

X

X

X

L'character'

X

X

-

X

X

X

u'character'

U'character'

X

-

-

X

-

-

string

X

X

X

X

X

X

L"string"

X

X

-

X

X

X

u"string"

U"string"

X

-

-

X

-

-

enum

X

X

X

X

X

X

Suffixe

integer L,l

X

X

X

X

X

X

integer U, u

X

X

-

X

X

X

integer LL, ll

X

-

-

X

X

X

float F, f

X

X

-

X

X

X

float L,l

X

X

-

X

X

X

Lexikalische Elemente

Anmerkungen

1) Digraph-Sequenzen

Digraph-Sequenzen sind erstmals im ISO-C-Amendment 1 definiert. Sie können mit der POSIX-Option -K alternative_tokens bzw. der SDF-Option ALTERNATIVE-TOKENS=*YES aktiviert werden. Im Modus C11 sind sie per Default aktiviert.

2) Externe Namenslängen

Genauere Informationen dazu unter "Implementierungsabhängiges Verhalten gemäß dem ANSI-/ISO-C-Standard", Unterpunkt Bezeichner.

3) Reservierte Schlüsselwörter

asm

continue

extern

int

signed

union

auto

default

float

long

sizeof

unsigned

break

do

for

register

static

void

case

double

goto

restrict

struct

volatile

char

else

if

return

switch

while

const

enum

inline

short

typedef


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.

Die Schlüsselwörter inline und restrict sind nur in C11 definiert und verfügbar.

Datentyp-Vereinbarung

C Sprachelemente

Sprachdefinition

Übersetzungs-Modus

C11

C89

K&R

C11

C89

K&R

Typ-Spezifizierer

void 1)

X

X

-

X

X

X

void * 1)

X

X

-

X

X

X

char

X

X

X

X

X

X

short

X

X

X

X

X

X

int

X

X

X

X

X

X

long

X

X

X

X

X

X

long long

X

-

-

X

X

X

float

X

X

X

X

X

X

double

X

X

X

X

X

X

long double

X

X

-

X

X

X

signed

X

X

-

X

X

X

unsigned

X

X

X

X

X

X

array [ ]

X

X

X

X

X

X

structure 2)

X

X

X

X

X

X

union 2)

X

X

X

X

X

X

(*)

X

X

X

X

X

X

enum

X

X

X

X

X

X

()

X

X

X

X

X

X

Typ-Attribute

const

X

X

-

X

X

o

volatile

X

X

-

X

X

o

Initialisierung

auto aggregate

X

X

-

X

X

X

Speicherklasse

typedef

X

X

X

X

X

X

extern

X

X

X

X

X

X

static

X

X

X

X

X

X

auto

X

X

X

X

X

X

register

X

X

X

X

X

X

Bitfeld-Typ

int

X

X

X

X

X

X

signed int

X

X

X

X

X

X

_Bool

X

-

-

X

X

X

all integral

-

-

-

X

X

X

Datentyp-Vereinbarung

Anmerkungen

1) void

Der Typ void bezeichnet eine leere Menge von Werten. Er kann auf folgende drei Arten verwendet werden:

      1. Resultattyp von Funktionen, die keinen Wert zurückliefern.
      2. Ein Zeiger auf void zeigt auf ein Objekt beliebigen Datentyps.
      3. In einer Funktionsdeklaration können Anzahl und Datentypen der Parameter angegeben werden (vgl. Prototyping). Mit void an Stelle der Parameterliste wird vereinbart, dass die Funktion keine Parameter hat.

  2) structure, union

Gemäß ANSI-C lassen sich Strukturen und Unions einander zuweisen (falls gleichen Typs), als Parameter an Funktionen übergeben und als Funktions-Returnwerte zurückliefern.
Diese Möglichkeiten werden auch im K&R-Modus unterstützt.

Konversionsregeln

C Sprachelemente

Sprachdefinition

Übersetzungs-Modus

C11

C89

K&R

C11

C89

K&R

value preserving

X

X

-

X

X

-

sign preserving

-

-

X

-

-

X

Konvertierungsregeln

Eine wesentliche Änderung von ANSI gegenüber K&R ergibt sich bei impliziten arithmetischen Konversionen.

Bei K&R werden die Operanden eines Ausdrucks entsprechend der „unsigned-preserving“-Regel konvertiert: Wird ein Operand vom Typ unsigned char oder unsigned short erweitert, ist das Ergebnis vom Typ unsigned int. Kommen in einem Ausdruck unsigned-Typen zusammen mit anderen Typen vor, hat das Ergebnis immer einen unsigned-Typ.

Bei ANSI gilt jedoch die Regel, den Wert zu bewahren („value-preserving“): Der Ergebnistyp hängt von der Größe des Operandentypen ab. Wird ein Operand vom Typ unsigned char oder unsigned short erweitert, ist das Ergebnis vom Typ int, wenn int groß genug ist, um alle Werte des kleineren Typs darzustellen. Ansonsten ist das Ergebnis vom Typ unsigned int.

Diese Änderung kann u.U. zu unterschiedlichen Ergebnissen von arithmetischen Ausdrücken und damit zu unterschiedlichem Programmverhalten führen. Dies muss beim Übergang von K&R-C auf ANSI-C berücksichtigt werden.

Funktionen

C Sprachelemente

Sprachdefinition

Übersetzungs-Modus

C11

C89

K&R

C11

C89

K&R

Definition „alt“ 1)

X

X

X

X

X

X

Definition „neu“

X

X

-

X

X

X

Prototyping 2)

X

X

-

X

X

o

Parametertypangleichung 3)

X

X

-

X

X

-

Funktionen

Anmerkungen

  1) Definition von Funktionen

ANSI hat gegenüber K&R eine neue Syntax für die Definition der formalen Funktionsparameter eingeführt, lässt jedoch auch noch die „alte“ (K&R) Syntax zu.
Beide Definitionsarten werden auch im K&R-Modus unterstützt.

2) Prototyping

ANSI definiert gegenüber K&R Funktions-Prototypen. Dies sind Funktions-Deklarationen, in denen zusätzlich Anzahl und Datentypen der einzelnen Parameter angegeben werden. Damit können vom Compiler die Datentypen der Aktualparameter gegen die Formalparameter der Deklaration geprüft und an die Formalparameter angeglichen werden.

Im K&R-Modus sind Prototyp-Deklarationen syntaktisch zugelassen, haben jedoch keine semantische Auswirkung.

3) Parametertyp-Angleichung

Prototyping bietet den weiteren Vorteil, dass die in der Funktionsdeklaration angegebenen Parameter nicht den Standard-Konversionsregeln unterworfen werden. Ein Parameter, der dort als float deklariert ist, wird auch als float übergeben. Im anderen Falle würde er vor der Übergabe nach double konvertiert werden. Bei Verknüpfung von K&R- und ANSI-Objekten sollten die Gleitkomma-Parameter immer als double deklariert werden.

Die automatische Parametertyp-Angleichung wird im K&R-Modus nicht unterstützt.

Präprozessoranweisungen

C Sprachelemente

Sprachdefinition

Übersetzungs-Modus

C11

C89

K&R

C11

C89

K&R

# (stringizing)

X

X

-

X

X

X

## (token pasting)

X

X

-

X

X

X

#assert / #unassert

-

-

-

X

X

X

#define

X

X

X

X

X

X

defined

X

X

-

X

X

X

#elif

X

X

-

X

X

X

#else

X

X

X

X

X

X

#endif

X

X

X

X

X

X

#error

X

X

-

X

X

X

#include

X

X

X

X

X

X

#if

X

X

X

X

X

X

#ifdef

X

X

X

X

X

X

#ifndef

X

X

X

X

X

X

#ident

-

-

-

o

o

o

#line

X

X

X

X

X

X

#line (old style)

-

-

X

X

X

X

#pragma

X

X

-

X

X

X

#pragma STDC

X

-

-

o

o

o

#undef

X

X

X

X

X

X

# (null directive)

X

X

-

X

X

X

Präprozessoranweisungen

Vordefinierte Makronamen

C Sprachelemente

Sprachdefinition

Übersetzungs-Modus

C11

C89

K&R

C11

C89

K&R

__LINE__

X

X

-

X

X

X

__FILE__

X

X

-

X

X

X

__DATE__

X

X

-

X

X

X

__TIME___

X

X

-

X

X

X

__STDC__

X

X

-

X

X

X

__STDC_VERSION__ 1)

X

X

-

X

X

-

Vordefinierte Makronamen

Anmerkungen

1) __STDC_VERSION__

Genauere Informationen dazu unter "Vordefinierte Präprozessornamen".