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