2012-10-02 7 views
45

ich bin zu finden, dass ich nicht als gültige Kennung mit g ++ 4.7, auch bei der -fextended-identifiers Option aktiviert verwenden kann:(und andere Unicode-Zeichen) in Bezeichnern nicht von g ++ erlaubt

int main(int argc, const char* argv[]) 
{ 
    const char* = "I'm very happy"; 
    return 0; 
} 

main.cpp:3:3: error: stray ‘\360’ in program
main.cpp:3:3: error: stray ‘\237’ in program
main.cpp:3:3: error: stray ‘\230’ in program
main.cpp:3:3: error: stray ‘\203’ in program

Nach einigem googeln entdeckte ich, dass UTF-8 characters are not yet supported in identifiers aber ein universal-character-name funktionieren sollte. Also ich konvertiere meine Quelle:

int main(int argc, const char* argv[]) 
{ 
    const char* \U0001F603 = "I'm very happy"; 
    return 0; 
} 

main.cpp:3:15: error: universal character \U0001F603 is not valid in an identifier

so offensichtlich ist kein gültiger Bezeichner Charakter. Die Norm erlaubt jedoch ausdrücklich Zeichen aus dem Bereich 10000-1FFFD in Anhang E.1 und verbietet es nicht als Anfangszeichen in E.2. Meine nächste Bemühung war zu sehen, ob irgendwelche anderen Unicode-Charaktere funktionierten - aber keine, die ich versuchte, tat. Nicht einmal der jemals wichtige PILE OF POO() Charakter.

Also, aus Gründen der sinnvollen und beschreibenden Variablennamen, was gibt? Tut -fextended-identifiers tun, wie es wirbt oder nicht? Wird es nur in der neuesten Version unterstützt? Und welche Art von Unterstützung haben andere Compiler?

+0

Read [diese] (http: /. /www.learncpp.com/cpp-tutorial/22-keywords-and-naming-identifiers/) – ErikEsTT

+0

@ErikEsTT Leider erwähnt diese Seite nicht, dass ein Bezeichner einen 'universal-character-name' enthalten kann, also was auch immer Ratschläge sie geben bei Namenskonventionen nicht an, wie wichtig es ist, Smileys als Variablennamen zu verwenden (siehe §2.11 von ISO/IEC 14882: 2011 (E). –

+2

Hmm, es scheint das Programm 'static const char * x =" I bin sehr glücklich ";" crashs clang 3.1 ... – kennytm

Antwort

15

Ab 4.8, gcc does not support characters outside of the BMP used as identifiers. Es scheint eine unnötige Einschränkung zu sein. Außerdem unterstützt gcc nur einen sehr eingeschränkten Zeichensatz, der in ucnid.tab beschrieben ist, basierend auf C und C++ (es ist noch nicht auf C11 und C++ 11 aktualisiert, scheint es).

Wie im Handbuch beschrieben, -fextended-identifiers is experimental, so hat es eine höhere Chance wird nicht wie erwartet funktionieren.


Edit:

GCC unterstützt das C11 starting from 4.9.0 Zeichensatz (svn r204886 genau zu sein). Also OPs zweiter Code mit \U0001F603 funktioniert. Ich kann immer noch nicht den tatsächlichen Code unter Verwendung , um sogar mit -finput-charset=UTF-8 mit GCC 7 on https://gcc.godbolt.org obwohl (Sie möchten vielleicht folgen this bug report, von @DanielWolf zur Verfügung gestellt) zu bekommen.

In der Zwischenzeit funktionieren beide Codeteile auf clang 3.3 ohne andere Optionen als -std=c++11.

+0

Wie wäre es 'main.cpp: 3: 15: Fehler: universelles Zeichen \ u00a8 ist in einer ID nicht gültig'? Dies ist jedoch mit 4.7. –

+1

@sftrabbit: Überprüfen Sie das Update. U + 00A8 war nicht Teil von C++ 98/03. – kennytm

4

However, the standard specifically allows characters from the range 10000-1FFFD in Annex E.1 and doesn't disallow it as an initial character in E.2.

Eine Sache im Auge zu behalten ist, dass, nur weil die C++ Standard erlaubt (oder nicht zulässt) ein Merkmal, bedeutet nicht unbedingt, dass Ihr Compiler unterstützt (oder nicht unterstützt) diese Funktion.

+0

Ja, das Zulassen der vollständigen Menge von Unicode-Zeichen, die durch den Standard spezifiziert sind, ist eine, die, soweit ich weiß, noch keine Compiler entweder wörtlich oder mit UCNs unterstützt. – bames53

+1

Natürlich! Ich wollte nur eine Dokumentation oder Quelle finden, die zeigt, dass sie diese Funktion nicht unterstützen. –

+1

@sftrabbit Okay, vielleicht zeigt meine Antwort das Offensichtliche. KennyTM gab den Link re: gcc. –

4

Dies ist ein bekannter Fehler in GCC: Bug 67224 - UTF-8 support for identifier names in GCC.

Der Fehlerbericht stammt aus 2015 und hat eine ziemlich lange Diskussion. Unter some point wird erwähnt, dass "Es scheint nicht genug Nachfrage für dieses Feature, so dass Unternehmen es finanzieren oder Freiwillige Schritt, um es zu implementieren."

Also, wenn Sie diese Stackoverflow Thema Suche nach einer Lösung gefunden, könnte man dort zur Diskussion hinzufügen möchten über zeigen, dass es in der Tat, die Nachfrage

Verwandte Themen