Unicode-Bezeichner und Quellcode in C ++ 11?

8

Ich finde im neuen C ++ Standard

%Vor%

mit dem zusätzlichen Text

  

Ein Bezeichner ist eine beliebig lange Folge von Buchstaben und Ziffern. Jeder universal-character-name in einem Bezeichner muss ein Zeichen bezeichnen, dessen Codierung in ISO 10646 in einen der angegebenen Bereiche fällt   in E.1. [...]

Ich kann nicht ganz verstehen, was das bedeutet. Von der alten Std bin ich gewohnt, dass ein "universeller Charaktername" zB \u89ab geschrieben wird. Aber mit denen in einem Bezeichner ...? Wirklich?

Ist der neue Standard w.r.t für Unicode offen? Und ich beziehe mich nicht auf die neuen Literaltypen "uHello \u89ab thing"u32 , ich glaube, ich habe diese verstanden. Aber:

  • Kann (portabler) Quellcode in einer beliebigen Unicode-Codierung wie UTF-8, UTF-16 oder einer (wie auch immer definierten) Codepage sein?
  • Kann ich einen Bezeichner mit \u1234 darin schreiben myfu\u1234ntion (für welchen Zweck auch immer)
  • Oder kann ich die "Charakternamen" verwenden, die Unicode wie in der ICU definiert, d. h.

    %Vor%

    oder sogar in einer Kennung in der Quelle selbst? Das wäre ein Vergnügen ... hust ...

Ich denke, die Antwort auf all diese Fragen ist nein , aber ich kann das nicht zuverlässig auf den Wortlaut im Standard abbilden ...: -)

Bearbeiten: Ich fand "2.2 Phasen der Übersetzung [lex.phases]", Phase 1:

  

Physische Quelldateizeichen werden in einer implementierungsdefinierten Weise dem grundlegenden Quellzeichensatz [...] zugeordnet, falls dies erforderlich ist. Die Menge der akzeptierten physischen Quelldateizeichen ist implementierungsdefiniert. [...] Ein beliebiges Quelltext-Zeichen, das nicht im Basic enthalten ist   Quellzeichensatz (2.3) wird durch den Universalzeichen-Namen ersetzt, der dieses Zeichen bezeichnet. (Eine Implementierung kann jede interne Codierung verwenden, solange ein tatsächliches erweitertes Zeichen in der Quelldatei gefunden wird und dasselbe erweiterte Zeichen in der Quelldatei als Universal-Charaktername (dh unter Verwendung der \ uXXXX-Notation) ausgedrückt wird behandelt äquivalent, außer wenn diese Ersetzung in einem Raw-String-Literal zurückgesetzt wird.)

Wenn ich das lese, denke ich jetzt, dass ein Compiler UTF-8, UTF-16 oder eine beliebige Codepage akzeptieren kann (durch Meta-Informationen oder Benutzerkonfiguration). In Phase 1 übersetzt es dies in eine ASCII-Form ("basic source character set"), in der dann die Unicode-Zeichen durch die \uNNNN -Notation ersetzt werden (oder der Compiler kann weiter in seiner Unicode-Darstellung arbeiten, aber als muss sicherstellen, dass es den anderen \uNNNN auf die gleiche Weise behandelt.

Was denkst du?

    
towi 15.04.2011, 12:49
quelle

5 Antworten

8
  

Ist der neue Standard mehr w.r.t zu Unicode?

In Bezug auf universelle Charakternamen in Bezeichnern ist die Antwort nein; UCNs waren in Kennungen in C99 und C ++ 98 erlaubt. Compiler haben diese spezielle Anforderung jedoch erst vor Kurzem umgesetzt. Clang 3.3 Ich denke, führt die Unterstützung dafür ein und GCC hat seit einiger Zeit eine experimentelle Funktion dafür. Herb Sutter erwähnte auch während seines Build 2013-Vortrags "Die Zukunft von C ++", dass dieses Feature irgendwann auch zu VC ++ kommen würde. (Obwohl IIRC Herb es als ein C ++ 11-Feature bezeichnet, ist es in der Tat ein C ++ 98-Feature.)

Es wird nicht erwartet, dass Identifikatoren mit UCNs geschrieben werden. Stattdessen besteht das erwartete Verhalten darin, das gewünschte Zeichen mithilfe der Quellcodierung zu schreiben. Zum Beispiel wird die Quelle wie folgt aussehen:

%Vor%

nicht:

%Vor%

Aber UCNs sind auch für einen anderen Zweck nützlich; Compiler müssen nicht alle die gleichen Quellcodierungen akzeptieren, aber moderne Compiler unterstützen alle ein Codierungsschema, bei dem zumindest die grundlegenden Quellzeichen die gleiche Codierung aufweisen (dh moderne Compiler unterstützen alle eine ASCII-kompatible Codierung).

Mit

UCNs können Sie Quellcode nur mit den grundlegenden Zeichen schreiben und dennoch erweiterte Zeichen verwenden. Dies ist beispielsweise beim Schreiben eines Zeichenfolgenliterals "°" in Quellcode nützlich, der sowohl als CP1252 als auch als UTF-8 kompiliert wird:

%Vor%

Dieses Zeichenfolgenliteral wird in die entsprechende Ausführungscodierung für mehrere Compiler codiert, selbst wenn die Quellcodierungen unterschiedlich sind, solange die Compiler mindestens die gleiche Codierung für Basiszeichen verwenden.

  

Kann (portabler) Quellcode in einer beliebigen Unicode-Codierung wie UTF-8, UTF-16 oder einer (wie auch immer definierten) Codepage sein?

Dies wird vom Standard nicht benötigt, aber die meisten Compiler akzeptieren die UTF-8-Quelle. Clang unterstützt only UTF-8-Quelle (obwohl es eine gewisse Kompatibilität für Nicht-UTF-8-Daten in Zeichen- und Stringliteralen bietet), gcc ermöglicht die Angabe der Quellencodierung und beinhaltet Unterstützung für UTF-8, und VC ++ wird bei der Codierung raten und kann dazu gebracht werden, UTF-8 zu erraten.

(Update: VS2015 bietet jetzt eine Option , um die Quell- und Ausführungszeichensätze zu erzwingen UTF-8 sein.)

  

Kann ich einen Bezeichner mit \ u1234 darin schreiben (aus welchem ​​Grund auch immer)

Ja, die Spezifikation schreibt dies vor, obwohl, wie gesagt, noch nicht alle Compiler diese Anforderung implementieren.

  

Oder kann ich die "Charakternamen" verwenden, die Unicode wie in der ICU definiert, d. h.

%Vor%

Nein, lange Unicode-Namen können nicht verwendet werden.

  

oder sogar in einer Kennung in der Quelle selbst? Das wäre ein Vergnügen ... hust ...

Wenn der Compiler eine Quellcodekodierung unterstützt, die das gewünschte erweiterte Zeichen enthält, muss das wörtlich in der Quelle geschriebene Zeichen genauso behandelt werden wie das entsprechende UCN. Wenn Sie also einen Compiler verwenden, der diese Anforderung der C ++ - Spezifikation unterstützt, dann können Sie ein beliebiges Zeichen in seinem Quellzeichensatz direkt in die Quelle schreiben, ohne UCNs zu schreiben.

    
bames53 02.07.2013, 17:19
quelle
2

Ich denke, die Absicht besteht darin, Unicode-Zeichen in Bezeichnern zuzulassen, beispielsweise:

%Vor%     
dalle 15.04.2011 13:12
quelle
1

Dieser Artikel Ссылка arbeitet mit der Idee, dass int \u0401; konformer Code ist, obwohl er auf C99 statt C ++ 0x basiert.

    
Mooing Duck 02.08.2011 16:49
quelle
1

Aktuelle Versionen von gcc (bis Version 5.2 bisher) unterstützen nur ASCII- und in einigen Fällen EBCDIC-Eingabedateien. Daher müssen Unicode-Zeichen in Bezeichnern mit den Escape-Sequenzen \ uXXXX und \ UXXXXXXXX in ASCII-kodierten Dateien dargestellt werden. Während es möglich ist, Unicode-Zeichen als ?? / uXXXX und ?? / UXXXXXXX in EBCDIC-kodierten Eingabedateien darzustellen, habe ich das nicht getestet. Bei anyrate ermöglicht ein einfacher einzeiliger Patch für cpp das direkte Lesen der UTF-8-Eingabe, sofern eine aktuelle Version von iconv installiert ist. Details sind in

Ссылка

und kann durch den Patch zusammengefasst werden

%Vor%     
ejolson 15.08.2015 00:20
quelle
0

Ich schlage vor, clang++ anstelle von g++ zu verwenden. Clang ist sehr kompatibel mit GCC ( wikipedia-source ), so dass Sie diesen Befehl wahrscheinlich nur ersetzen können .

Ich wollte griechische Symbole in meinem Quellcode verwenden. Wenn Codelesbarkeit das Ziel ist, dann ist es sinnvoll, zum Beispiel α über alpha zu verwenden. Insbesondere wenn sie in größeren mathematischen Formeln verwendet werden, können sie leichter im Quellcode gelesen werden.

Um dies zu erreichen, ist dies ein minimales Arbeitsbeispiel:

%Vor%     
Yeti 25.09.2016 15:41
quelle

Tags und Links