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?
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
.
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).
.
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