😃 (und andere Unicode-Zeichen) in Bezeichnern, die von g++ nicht erlaubt sind

Lesezeit: 3 Minuten

und andere Unicode Zeichen in Bezeichnern die von g nicht erlaubt
Josef Mansfeld

Ich bin 😞 zu finden, dass ich nicht verwenden kann 😃 als gültiger Bezeichner mit g++ 4.7, sogar mit der -fextended-identifiers Option aktiviert:

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

main.cpp:3:3: error: verirrte ‘360’ im Programm
main.cpp:3:3: error: verirrt ‘237’ im Programm
main.cpp:3:3: error: verirrte ‘230’ im Programm
main.cpp:3:3: error: verirrt ‘203’ im Programm

Nach einigem Googeln habe ich das entdeckt UTF-8-Zeichen werden in Bezeichnern noch nicht unterstütztaber ein universeller Charaktername sollte arbeiten. Also konvertiere ich meine Quelle in:

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 a identifier

Anscheinend ist 😃 kein gültiges Erkennungszeichen. Der Standard 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 Anstrengung bestand darin, zu sehen, ob andere zulässige Unicode-Zeichen funktionierten – aber keines, das ich ausprobierte, tat es. Nicht einmal das immer Wichtige HAUFEN KÄUFE (💩) Charakter.

Was gibt es also für aussagekräftige und beschreibende Variablennamen? Tut -fextended-identifiers tun, was es wirbt oder nicht? Wird es nur im allerneuesten Build unterstützt? Und welche Art von Unterstützung haben andere Compiler?

  • Nur neugierig: Welche schrecklichen Dinge haben die Leute, die Ihren Code warten müssen, Ihnen angetan, um Identifikatoren wie zu verdienen U0001F603?

    – Philipp

    2. Oktober 12 um 15:18 Uhr

  • Sie nennen es C/C++ – es ist gerechtfertigt.

    – Josef Mansfeld

    2. Oktober 12 um 15:23 Uhr


  • “wegen aussagekräftiger und beschreibender Variablennamen” – ROFLMAO? Entschuldigung, ich meinte 😸.

    – verzeihen

    2. Oktober 12 um 15:28 Uhr

  • Die Frage lautet: „Also, um aussagekräftiger und beschreibender Variablennamen willen, was ergibt das?“ — Die Antwort lautet: „Hör auf mit dem Herumalbern und mach dich wieder an die Arbeit“. 🙂

    – Ben

    2. Oktober 12 um 15:43 Uhr


  • Verdammt, ich denke, 💩 ist der passendste Name für eine Klasse, mit der ich gearbeitet habe.

    Benutzer3995702

    9. Juni 16 um 16:37 Uhr

und andere Unicode Zeichen in Bezeichnern die von g nicht erlaubt
kennytm

Ab 4.8, gcc unterstützt keine Zeichen außerhalb des BMP, die als Bezeichner verwendet werden. Es scheint eine unnötige Einschränkung zu sein. Außerdem unterstützt gcc nur einen sehr eingeschränkten Zeichensatz, der in beschrieben wird ucnid.tabbasierend auf C99 und C++98 (Es scheint noch nicht auf C11 und C++11 aktualisiert worden zu sein).

Wie im Handbuch beschrieben, -fextended-identifiers ist experimentelldaher ist die Wahrscheinlichkeit höher, dass es nicht wie erwartet funktioniert.


Bearbeiten:

GCC unterstützte den C11-Zeichensatz ab 4.9.0 (svn r204886 um genau zu sein). Also das zweite Stück Code von OP mit U0001F603 funktioniert. Ich kann den eigentlichen Code immer noch nicht abrufen 😃 sogar mit zu arbeiten -finput-charset=UTF-8 mit GCC 8.2 auf https://gcc.godbolt.org obwohl (Vielleicht möchten Sie folgen dieser Fehlerberichtbereitgestellt von @DanielWolf).

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

  • Wie wäre es mit main.cpp:3:15: error: universal character u00a8 is not valid in an identifier? Dies ist jedoch mit 4.7.

    – Josef Mansfeld

    2. Oktober 12 um 15:29 Uhr

1644036609 766 und andere Unicode Zeichen in Bezeichnern die von g nicht erlaubt
Daniel Wolf

Dies war ein bekannter Fehler in GCC 9 und davor. Dies wurde repariert im GCC 10.

Der offizielles Änderungsprotokoll für GCC 10 enthält diesen Abschnitt:

Erweiterte Zeichen in Bezeichnern können jetzt zusätzlich zur UCN-Syntax (uNNNN oder UNNNNNNNN), die bereits unterstützt wird:

static const int π = 3;
int get_naïve_pi() {
  return π;
}

Der Standard erlaubt jedoch ausdrücklich Zeichen aus dem Bereich 10000-1FFFD in Anhang E.1 und verbietet es nicht als Anfangszeichen in E.2.

Eine Sache, die Sie im Hinterkopf behalten sollten, ist, dass nur weil der C++-Standard ein Feature zulässt (oder nicht zulässt), dies nicht unbedingt bedeutet, dass Ihr Compiler dieses Feature unterstützt (oder nicht unterstützt).

  • Ja, das Zulassen des vollständigen Satzes von Unicode-Zeichen, die vom Standard angegeben sind, wird meines Wissens noch von keinem Compiler unterstützt, weder wörtlich noch mit UCNs.

    – Namen53

    2. Oktober 12 um 15:42 Uhr

  • Na sicher! Ich wollte nur eine Dokumentation oder Quelle finden, die zeigt, dass sie diese Funktion nicht unterstützen.

    – Josef Mansfield

    2. Oktober 12 um 15:47 Uhr

  • @sftrabbit Okay, vielleicht weist meine Antwort auf das Offensichtliche hin. KennyTM gab den Link re: gcc.

    – Code-Lehrling

    2. Oktober 12 um 15:49 Uhr

.

778610cookie-check😃 (und andere Unicode-Zeichen) in Bezeichnern, die von g++ nicht erlaubt sind

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy