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 sieben C++-Übersetzungsmodi, die sich an unterschiedlichen Sprachdefinitionen orientieren:

Cfront-C++-Modus (POSIX-Option -X V2-COMPATIBLE, SDF-Option MODE=*V2-COMPATIBLE)

Der Compiler akzeptiert Cfront V3.0.3-kompatiblen C++-Code.

erweiterter C++ V3-Modus (POSIX-Option -X V3-COMPATIBLE -X nostrict, SDF-Option MODE=*V3-COMPATIBLE,STRICT=*NO)

Der Compiler akzeptiert C++-Code analog zum C/C++ V3-Compiler im erweiterten Modus.

strikter C++ V3-Modus (POSIX-Option -X V3-COMPATIBLE -X strict, SDF-Option MODE=*V3-COMPATIBLE,STRICT=*YES)

Der Compiler akzeptiert C++-Code analog zum C/C++ V3-Compiler im strikten Modus.

erweiterter C++ 2017-Modus (POSIX-Option -X 2017 -X nostrict, SDF-Option MODE=*2017,STRICT=*NO)

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

strikter C++ 2017-Modus (POSIX-Option -X 2017 -X strict, SDF-Option MODE=*2017,STRICT=*YES)

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

erweiterter C++ 2020-Modus (POSIX-Option -X 2020 -X nostrict, SDF-Option MODE=*2020,STRICT=*NO)

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

strikter C++ 2020-Modus (POSIX-Option -X 2020 -X strict, SDF-Option MODE=*2020,STRICT=*YES)

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

Die folgende Tabelle gibt einen Überblick über die wichtigsten Unterschiede zwischen den C++-Sprachmodi.

Merkmal / Spracheigenschaft

Cfront C++

C++ V3

C++ 2017

C++ 2020

reservierte Schlüsselwörter 1)

overload

ja

nein

nein

nein

Ausnahmebehandlung
catch, throw, try

nein 2)

ja

ja

ja

Templates

template

nein 2)

ja

ja

ja

Sprachkonstrukte von C++ 1998

Laufzeit-Typinformation (RTTI)

typeid, dynamic_cast

nein 3)

ja

ja

ja

Array-new/delete

new[], delete[]

neinja

ja

ja

Namensraum

namespace, using

nein

ja

ja

ja

Template-Parameter typename

nein

ja

ja

ja

Konstruktor-Typ explicit

nein

ja

ja

ja

Datentyp wchar_t

nein

ja 4)

ja

ja

Datentyp bool

nein

ja 5)

ja

ja

Speicherklasse mutable

ja

ja

ja

ja

Casting-Schlüsselwörter

const_cast, reinterpret_cast, static_cast

ja

ja

ja

ja

export 6)

nein

nein

ja

nein

externe inline-Funktionen

nein

nein

ja

ja

Symbol-Suche in Namenräumen einer Argument-Klasse (Koenig-Lookup)

nein

nein

ja

ja

Sprachkonstrukte von C++ 2017

Alignment-Kontrolle

alignas, alignof

neinneinjaja
Semantik von autoSpeicherklasseSpeicherklasseTypTyp

Unicode Unterstützung:

Literale u"x", U"x", u8"x", u'x', U'x', u8'x',

char16_t, char32_t

neinneinjaja

Berechnung zur Übersetzungszeit

constexpr

neinneinjaja
decltypeneinneinjaja

long long

ja

ja

ja

ja

noexcept 7)neinneinjaja
nullptrneinneinjaja
register (wurde in C++17 verboten)jajaneinnein
static_assertneinneinjaja
thread_localneinneinja 8) ja 8)
Trigraph (z.B. ??<)jajaneinnein
Sprachkonstrukte von C++ 2020

char8_t

neinneinneinja

erweiterte Berechnung zur Übersetzungszeit

consteval, constinit

neinneinneinja
operator <=>neinneinneinja
concept, requiresneinneinneinja

Co-Routinen co_await, co_return, co_yield

neinneinneinnein 9)
Moduleneinneinneinja 10)
vordefinierte Präprozessornamen

__STDC_VERSION__

==199409L

==199409L

==199409L

==199409L

__cplusplus

==1

==2 (erweitert)

==199612L (strikt)

==201703L

==202002L

Überblick über die Unterschiede zwischen den C++-Sprachmodi

1) Reservierte Schlüsselwörter

Alle im Kapitel „C-Sprachunterstützung des Compilers“ (Die C-Sprachmodi im Überblick) aufgeführten Schlüsselwörter, außer restrict, sind auch in den C++-Sprachmodi reserviert. Hinzu kommen die folgenden C++-spezifischen Schlüsselwörter. Schlüsselwörter in Fettdruck sind nicht in allen C++-Sprachmodi reserviert (siehe obige Tabelle).

alignas

concept

delete

new

requires

typeid

alignof

const_cast

dynamic_cast

noexcept

static_assert

typename

asm

consteval

explicit

nullptr

static_cast

using

bool

constexpr

export

operator

template

virtual

catch

constinit

false

overload

this

wchar_t

char8_t

co_await

friend

private

thread_local


char16_t

co_return

inline

protected

throw


char32_t

co_yield

mutable

public

true


class

decltype

namespace

reinterpret_cast

try


Reservierte Namen in C++

Die folgenden Schlüsselwörter können als Ersatzdarstellungen für C-Operatoren verwendet werden. Sie sind abhängig von den Optionen -K alternative_token

-K no_alternative_token bzw. ALTERNATIVE-TOKENS=*YES/*NO reserviert oder nicht. Im Cfront-C++-Modus ist nicht reserviert voreingestellt, in den C++ V3-Modi, den C++ 2017-Modi und den C++ 2020-Modi reserviert.

and

&&

not_eq

!=

and_eq

&=

or

||

bitand

&

or_eq

|=

bitor

|

xor

^

compl

~

xor_eq

^=

not

!



Schlüsselwort-Operatoren in C++


2) Ausnahmebehandlung, Templates

Im Cfront-C++-Modus werden Ausnahmebehandlung und Templates nicht unterstützt. Die Schlüsselwörter catch, throw, try und template sind jedoch nicht frei verfügbar und führen bei Gebrauch zu einer Fehlermeldung.

3) Laufzeit-Typinformation (RTTI)

Im Cfront-C++-Modus ist das Schlüsselwort dynamic_cast aktiv. Es wird geprüft, ob die damit angesprochene Operation echte Laufzeit-Information benötigt oder ob sie mit Hilfe der statischen Typ-Information gemacht werden kann. Reicht die statische Information, wird der passende Code generiert. Braucht es dynamische Information, wird eine Fehlermeldung ausgegeben.

4) Datentyp wchar_t

In den C++ V3-Modi ist das Schlüsselwort wchar_t abhängig von den Optionen -K wchar_t_keyword, -K no_wchar_t_keyword bzw. KEYWORD-WCHAR=*YES/*NO reserviert. -K wchar_t_keyword bzw. KEYWORD-WCHAR=*YES ist voreingestellt.

5) Datentyp bool

In den C++ V3-Modi sind die Schlüsselwörter bool, true und false abhängig von den Optionen -K bool, -K no_bool bzw. KEYWORD-BOOL=*YES/*NO reserviert. -K bool bzw. KEYWORD-BOOL=*YES ist voreingestellt.

 6) export

Die Nutzung des Wortes export führt in allen C++-Modi zu einer Meldung. In C++ 2017 ist es ein Fehler, in C++V2 und C++ V3 eine Warnung. In C++ 2020 ist es Teil der Syntax für Module10). Die hinter dem Schlüsselwort stehende Semantik wird vom C/C++ Compiler nicht angeboten.

 7) noexcept: Ausnahmebehandlung als Teil des Typs

Es gibt in C++ die Möglichkeit, für eine Funktion anzugeben, ob sie Ausnahmen (Exceptions) auslöst oder nicht. Ab C++17 ist nur noch die Angabe ja/nein erlaubt, und diese Angabe ist Teil des Typs der Funktion. Vorher konnte eine Liste von Typen angegeben werden, die geworfen werden können. Diese Liste wurde dynamisch geprüft und war kein Teil des Typs der Funktion.

  8) thread_local

Der Standard C++ 2017 definiert thread_local als Schlüsselwort. Es kann im Rahmen von Threads genutzt werden. Da der C/C++ Compiler keine Thread-Implementierung unterstützt, wird das Schlüsselwort als solches erkannt und mit einer Fehlermeldung abgewiesen.

 9) Co-Routinen

Das Sprach-Feature Co_Routinen ist im aktuellen Compiler nicht implementiert. Die Benutzung der Schlüsselwörter gibt eine Warnung. Danach wird das benutzte Schlüsselwort wie ein normaler Bezeichner betrachtet.

 10) Module

Das Sprach-Feature Module ist im aktuellen Compiler nicht implementiert. Die Syntax für Module wird erkannt und mit einer Fehlermeldung abgewiesen.