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) | ||||
| ja | nein | nein | nein |
Ausnahmebehandlung | nein 2) | ja | ja | ja |
Templates
| nein 2) | ja | ja | ja |
Sprachkonstrukte von C++ 1998 | ||||
Laufzeit-Typinformation (RTTI)
| nein 3) | ja | ja | ja |
Array-new/delete
| nein | ja | ja | ja |
Namensraum
| nein | ja | ja | ja |
Template-Parameter | nein | ja | ja | ja |
Konstruktor-Typ | nein | ja | ja | ja |
Datentyp | nein | ja 4) | ja | ja |
Datentyp | nein | ja 5) | ja | ja |
Speicherklasse | ja | ja | ja | ja |
Casting-Schlüsselwörter
| ja | ja | ja | ja |
| nein | nein | ja | nein |
externe | nein | nein | ja | ja |
Symbol-Suche in Namenräumen einer Argument-Klasse (Koenig-Lookup) | nein | nein | ja | ja |
Sprachkonstrukte von C++ 2017 | ||||
Alignment-Kontrolle
| nein | nein | ja | ja |
Semantik von auto | Speicherklasse | Speicherklasse | Typ | Typ |
Unicode Unterstützung: Literale u"x", U"x", u8"x", u'x', U'x', u8'x',
| nein | nein | ja | ja |
Berechnung zur Übersetzungszeit
| nein | nein | ja | ja |
decltype | nein | nein | ja | ja |
| ja | ja | ja | ja |
noexcept 7) | nein | nein | ja | ja |
nullptr | nein | nein | ja | ja |
register (wurde in C++17 verboten) | ja | ja | nein | nein |
static_assert | nein | nein | ja | ja |
thread_local | nein | nein | ja 8) | ja 8) |
Trigraph (z.B. ??< ) | ja | ja | nein | nein |
Sprachkonstrukte von C++ 2020 | ||||
| nein | nein | nein | ja |
erweiterte Berechnung zur Übersetzungszeit
| nein | nein | nein | ja |
operator <=> | nein | nein | nein | ja |
concept , requires | nein | nein | nein | ja |
Co-Routinen | nein | nein | nein | nein 9) |
Module | nein | nein | nein | ja 10) |
vordefinierte Präprozessornamen | ||||
| ==199409L | ==199409L | ==199409L | ==199409L |
| ==1 | ==2 (erweitert) ==199612L (strikt) | ==201703L | ==202002L |
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 |
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 | ! |
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.