Alternative operator representations
C++ (und C) Quellcode kann in jedem nicht-ASCII 7-Bit-Zeichensatz geschrieben werden, der den ISO 646:1983 invarianten Zeichensatz enthält. Jedoch erfordern mehrere C++ Operatoren und Satzzeichen Zeichen, die außerhalb des ISO 646 Codesets liegen: {, }, [, ], #, \, ^, |, ~. Um Zeichensätze verwenden zu können, in denen einige oder alle dieser Symbole nicht existieren (wie z.B. das deutsche DIN 66003), definiert C++ die folgenden Alternativen, die aus ISO 646 kompatiblen Zeichen zusammengesetzt sind.
Inhalt |
[edit] Alternative Tokens
Es gibt alternative Schreibweisen für mehrere Operatoren und andere Tokens, die nicht-ISO646 Zeichen verwenden. In jeder Hinsicht der Sprache verhält sich jedes alternative Token exakt gleich wie sein primäres Token, außer seiner Schreibweise (der Stringifizierungsoperator kann die Schreibweise sichtbar machen). Die zwei-Buchstaben-Alternativ-Tokens werden manchmal "Digraphen" genannt. Trotz ihrer vier Buchstabenlänge wird %:%: ebenfalls als Digraph betrachtet.
| Primär | Alternative |
|---|---|
&&
|
und |
&=
|
and_eq |
&
|
bitand |
|
|
bitor |
~
|
compl |
!
|
not |
!=
|
not_eq |
||
|
or |
|=
|
or_eq |
^
|
xor |
^=
|
xor_eq |
{ |
<%
|
} |
%>
|
[ |
<:
|
] |
:>
|
# |
%:
|
## |
%:%:
|
[edit] Trigraphen (entfernt in C++17)
Die folgenden Drei-Zeichen-Gruppen (Trigraphen) werden vor Kommentaren und String-Literalen erkannt, und jede Erscheinung eines Trigraphen wird durch das entsprechende primäre Zeichen ersetzt
| Primär | Trigraph |
|---|---|
{ |
??<
|
} |
??>
|
[ |
??(
|
] |
??)
|
# |
??=
|
\ |
??/
|
^ |
??'
|
| |
??!
|
~ |
??-
|
Da Trigraphen früh verarbeitet werden, wird ein Kommentar wie // Wird die nächste Zeile ausgeführt?????/ effektiv die folgende Zeile auskommentieren, und ein String-Literal wie "Datum eingeben ??/??/??" wird als "Datum eingeben \\??" geparst.
[edit] Notizen
Die Zeichen & und ! sind unter ISO-646 invariant, aber Alternativen werden für die Tokens, die diese Zeichen verwenden, trotzdem bereitgestellt, um noch restriktivere historische Zeichensätze zu berücksichtigen.
Es gibt keine alternative Schreibweise (wie z.B. eq) für den Gleichheitsoperator ==, da das Zeichen = in allen unterstützten Zeichensätzen vorhanden war.
[edit] Kompatibilität mit C
Die gleichen Wörter sind in der C-Programmiersprache in der Include-Datei <iso646.h> als Makros definiert. Da diese in C++ in die Sprache eingebaut sind, definiert die C++-Version von <iso646.h>, sowie <ciso646>, nichts. Die Nicht-Wort-Digraphen (z.B. <%) sind jedoch Teil der Kernsprache und können ohne Einbindung eines Headers verwendet werden (andernfalls wären sie auf jedem Zeichensatz, dem # fehlt, unbrauchbar).
[edit] Schlüsselwörter
and, and_eq, bitand, bitor, compl, not, not_eq, or, or_eq, xor, xor_eq
[edit] Beispiel
Das folgende Beispiel demonstriert die Verwendung mehrerer alternativer Tokens.
%:include <iostream> struct X <% compl X() <%%> // destructor X() <%%> X(const X bitand) = delete; // copy constructor // X(X and) = delete; // move constructor bool operator not_eq(const X bitand other) <% return this not_eq bitand other; %> %>; int main(int argc, char* argv<::>) <% // lambda with reference-capture: auto greet = <:bitand:>(const char* name) <% std::cout << "Hello " << name << " from " << argv<:0:> << '\n'; %>; if (argc > 1 and argv<:1:> not_eq nullptr) greet(argv<:1:>); else greet("Anon"); %>
Mögliche Ausgabe
Hello Anon from ./a.out
[edit] Referenzen
- C++23 Standard (ISO/IEC 14882:2024)
- 5.5 Alternative Tokens [lex.digraph]
- C++20 Standard (ISO/IEC 14882:2020)
- 5.5 Alternative Tokens [lex.digraph]
- C++17 Standard (ISO/IEC 14882:2017)
- 5.5 Alternative Tokens [lex.digraph]
- C++14 Standard (ISO/IEC 14882:2014)
- 2.4 Trigraph-Sequenzen [lex.trigraph]
- 2.6 Alternative Tokens [lex.digraph]
- C++11 Standard (ISO/IEC 14882:2011)
- 2.4 Trigraph-Sequenzen [lex.trigraph]
- 2.6 Alternative Tokens [lex.digraph]
- C++03-Standard (ISO/IEC 14882:2003)
- 2.3 Trigraph-Sequenzen [lex.trigraph]
- 2.5 Alternative Tokens [lex.digraph]
- C++98 Standard (ISO/IEC 14882:1998)
- 2.3 Trigraph-Sequenzen [lex.trigraph]
- 2.5 Alternative Tokens [lex.digraph]
[edit] Siehe auch
| C Dokumentation für Alternative Operatoren und Tokens
|