Was ist die Verwendung von universellen Zeichennamen in Bezeichnern in C ++

11

Der C ++ - Standard (ich habe ihn im neuen bemerkt, aber er war bereits in C ++ 03 vorhanden) gibt universelle Zeichennamen an, die als \uNNNNund geschrieben sind \UNNNNNNNNund die Zeichen mit Unicode-Codepunkten NNNN/ darstellen NNNNNNNN. Dies ist bei String-Literalen nützlich, insbesondere da explizit auch UTF-8-, UTF-16- und UCS-4-String-Literale definiert sind. Die universellen Zeichenliterale sind jedoch auch in Bezeichnern zulässig. Was ist die Motivation dahinter?

Die Syntax ist offensichtlich völlig unlesbar, die Bezeichner können für den Linker entstellt sein und es ist ohnehin nicht so, als gäbe es eine Standardfunktion zum Abrufen von Symbolen nach Namen. Warum sollte jemand einen Bezeichner mit universellen Zeichenliteralen verwenden?

Bearbeiten: Da es tatsächlich bereits in C ++ 03 vorhanden war, wäre eine zusätzliche Frage, ob Sie tatsächlich einen Code gesehen haben, der es verwendet hat?

Jan Hudec
quelle

Antworten:

6

UPDATE - Diese Antwort, obwohl sie für mich und andere sinnvoll erschien, erweist sich als weitgehend falsch (und in Bezug auf die Absicht hinreichend falsch, um tatsächlich einfach falsch zu sein). Da (wie erwähnt in einem Kommentar von AProgrammer) es nicht erlaubt UCS außerhalb von String - Konstanten zu verwenden , wenn das gleiche Zeichen normalerweise in dem Basiszeichensatz dargestellt werden könnte. Verwenden Sie es also nicht, um Schlüsselwörter zu umgehen, wie in meinem Beispiel. und keine Verwendung, um "Identifikatoren" wie 23skiddodurch Flucht vor dem zu machen2. Es könnte immer noch verwendet werden, um Namen mit externen Sprachen kompatibel zu machen, aber nur, wenn diese Namen entweder mit einem Buchstaben oder einem erweiterten Zeichen beginnen und nur Buchstaben, Ziffern, Unterstreichungen und erweiterte Zeichen enthalten - welche scheint viel zu restriktiv, um diese Absicht richtig zu unterstützen. Es muss also sein, dass die Hauptabsicht (wie in der Antwort von AProgrammer) darin besteht, diese zusätzlichen Zeichen in Bezeichnern zuzulassen und Quelleditoren zu aktivieren, in denen diese Zeichen grafisch angezeigt werden, während die Quelldatei weiterhin in einfachem ASCII-Format vorliegt.


C ++ - Programme können Funktionen aufrufen, die in anderen Sprachen geschrieben sind. Es ist eine gute Strategie des Standardisierungsausschusses, sicherzustellen, dass C ++ mit anderen Sprachen kompatibel ist, die möglicherweise nicht alphanumerische Zeichen oder Unicode-Zeichen in Funktionsnamen zulassen, auch wenn solche Sprachen noch nicht vorhanden sind. Der Standard muss nicht angeben, wie dies auf Linker-Ebene usw. funktioniert. Es ist jedoch gut, einen bestimmten Mechanismus zu haben, um dies zu ermöglichen.

Sie müssen nicht in die Zukunft schauen, um eine Verwendung dafür zu sehen. Angenommen, ich habe eine alte C-Bibliothek mit einer Funktion namens catch(oder geschützt oder veränderlich) ... und möchte sie von C ++ aus aufrufen. Und aus irgendeinem Grund kann oder will ich den C-Code nicht ändern (Übrigens musste ich mich mehr als einmal mit altem C-Code befassen, der einen Funktionsnamen verwendete, der zu einem C ++ - Schlüsselwort geworden war ...)

Mit UC-Namen kann ich dies in einen Header schreiben und dann einfach 'catch_func ()' aufrufen:

extern "C" {
       int catc\u0068( int a, int b );  // C 'catch()' function
}
inline int catch_func( int a, int b ) { return catc\u0068(a,b); }

Sicher, es ist hässlich, aber es spielt keine Rolle, da es sich nur an einer Stelle im Header befindet. Der gleiche Ansatz könnte verwendet werden, um Stubs dazu zu bringen, Funktionen in anderen Sprachen aufzurufen, und funktioniert auch dann, wenn die Namen C ++ - Schlüsselwörter oder Unicode sind oder Leerzeichen .oder andere Interpunktion darin eingebettet sind

Verschiedene andere Sprachen verfügen über Geräte, mit denen Bezeichner erstellt werden können, die nicht dem allgemeinen Muster entsprechen. Zum Beispiel in Verilog \abcdist ein Bezeichner äquivalent zu abcd, aber \whileund \23skidoound \44.e2sind auch Bezeichner, für die das Backslash-Präfix als solches angesehen werden muss. Aufgrund der Art und Weise, wie Verilog verwendet wird, ist es wichtig, überhaupt Namen zuzulassen, die sich auf externe Schnittstellen beziehen.

Greggo
quelle
Interessanter Anwendungsfall. Obwohl ich vermute (wenn möglich), wäre es besser, eine kleine C-Datei zu schreiben, um den Namen zu übersetzen (und somit den C ++ - Bezeichner verwenden zu können) und C ++ diese C-Funktion aufrufen zu lassen.
Thomas Eding
1
Sie können das aus zwei Gründen nicht schreiben: Erstens können UCS außerhalb von Zeichenfolgen- und Zeichenliteralen nicht auf Zeichen in den Basissätzen verweisen, ohne dass das Programm fehlerhaft ist, zweitens, wenn diese Klausel nicht vorhanden war, werden UCS in Phase 1 der Übersetzung und behandelt Somit würde es keinen Unterschied in der Handhabung zwischen einem BKS, das sich auf ein Zeichen im Basissatz bezieht, und dem Zeichen selbst geben.
AProgrammer
4

Es ermöglicht einem System, das es Unicode-Zeichen in der Kennung ermöglicht, die Quelle in einem Format zu exportieren, das auf allen standardkonformen Compilern kompilierbar ist. IE ist eine Möglichkeit, Unicode über den Basiszeichensatz zu codieren (mehr oder weniger wie in Anführungszeichen verwendet, wird für E-Mails verwendet, Systeme, die es besser wissen, können bessere Arbeit leisten, andere Systeme funktionieren noch).

Ein Programmierer
quelle
2

Möglicherweise möchte jemand eine Kennung mit einem fremdsprachigen Zeichen erstellen, das nicht über die Tastatur oder das Eingabegerät eingegeben werden kann. Alternativ kann der Bezeichner ein Zeichen enthalten, das mit der Schriftart oder den Ausgabefunktionen des Geräts nicht gedruckt werden kann, aber die IDE möchte eine genaue Darstellung anzeigen.

akton
quelle
4
Im ersten Fall würde der Bezeichner nicht so aussehen, als hätte er dieses Zeichen, sodass der Code nicht lesbar wäre und der Bezeichner für die Maschine nicht wirklich von Bedeutung ist. Und zum zweiten ist die Darstellung in IDE ein völlig eigenständiges Problem.
Jan Hudec
1

C ++ erfordert, dass sich tatsächlich erweiterte Zeichen, die buchstäblich in der Quelle erscheinen, identisch mit universellen Zeichennamen verhalten. Durch das Zulassen universeller Zeichennamen in Bezeichnern können Programmierer erweiterte Zeichen in Bezeichnern verwenden.

bames53
quelle
Wenn tatsächlich erweiterte Zeichen unterstützt werden, müssen sie sich als entsprechende universelle Zeichen verhalten. Sie müssen aber nicht unterstützt werden.
Jan Hudec
1
Das stimmt, aber es geht irgendwie am Punkt vorbei: Wenn das Komitee festlegen möchte, dass Implementierungen, die erweiterte Zeichen unterstützen, die Verwendung dieser Zeichen in Bezeichnern unterstützen sollen, müssen UCNs in Bezeichnern zugelassen werden. Das heißt, UCNs sind in Bezeichnern zulässig, nicht unbedingt, weil dies so lesbar ist und jeder es liebt, Namen manuell hexadezimal zu codieren, sondern weil die Spezifikation die Verwendung erweiterter Zeichen in Bezeichnern zulassen möchte, indem angegeben wird, dass UCNs in Bezeichnern zulässig sind.
Bames53