😃 (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