variable una tipos termino significado reglas que programacion posible los lenguaje identificar identificadores identificador ejemplos constantes como 2do c++ gcc unicode c++11 g++

c++ - una - 😃(y otros caracteres Unicode) en identificadores no permitidos por g++



tipos de identificadores (3)

Sin embargo, el estándar permite específicamente caracteres del rango 10000-1FFFD en el Anexo E.1 y no lo desautoriza como un carácter inicial en E.2.

Una cosa a tener en cuenta es que el hecho de que el estándar de C ++ permita (o no) alguna característica, no necesariamente significa que el compilador admita (o no admita) esa característica.

Estoy 😞 para encontrar que no puedo usar 😃 como un identificador válido con g ++ 4.7, incluso con la opción -fextended-identifiers habilitada:

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

main.cpp: 3: 3: error: extraviar ''/ 360'' en el programa
main.cpp: 3: 3: error: extraviar ''/ 237'' en el programa
main.cpp: 3: 3: error: extraviar ''/ 230'' en el programa
main.cpp: 3: 3: error: extraviar ''/ 203'' en el programa

Después de buscar en Google, descubrí que los caracteres UTF-8 todavía no son compatibles con los identificadores, pero debería funcionar un nombre de carácter universal . Así que convierto mi fuente a:

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

main.cpp: 3: 15: error: el carácter universal / U0001F603 no es válido en un identificador

Aparentemente, 😃 no es un identificador válido. Sin embargo, el estándar permite específicamente caracteres del rango 10000-1FFFD en el Anexo E.1 y no lo desautoriza como un carácter inicial en E.2. Mi siguiente esfuerzo fue ver si funcionaban otros caracteres Unicode permitidos, pero ninguno de los que intenté lo hizo. Ni siquiera el siempre importante personaje PILE OF POO (PI) .

Entonces, por el bien de los nombres de variables descriptivas y significativas, ¿qué da? ¿ -fextended-identifiers hacen lo que anuncia o no? ¿Solo se admite en la versión más reciente? ¿Y qué tipo de soporte tienen otros compiladores?


A partir de 4.8, gcc no admite caracteres fuera del BMP utilizados como identificadores . Parece ser una restricción innecesaria. Además, gcc solo admite un conjunto de caracteres muy restringido descrito en ucnid.tab , basado en C 99 y C ++ 98 (parece que no se actualizó a C11 y C ++ 11).

Como se describe en el manual, -fextended-identifiers son experimentales , por lo que tiene una mayor probabilidad de no funcionar como se esperaba.

Editar:

GCC apoyó el conjunto de caracteres C11 a partir de 4.9.0 ( svn r204886 para ser precisos). Entonces, el segundo código de OP que usa /U0001F603 funciona. Todavía no puedo obtener el código actual usando 😃 para trabajar incluso con -finput-charset=UTF-8 con GCC 7 en https://gcc.godbolt.org (Puede querer seguir este informe de error , provisto por @DanielWolf ).

Mientras tanto, ambas piezas de código funcionan en clang 3.3 sin ninguna otra opción que no sea -std=c++11 .


Este es un error conocido en GCC: error 67224 - Soporte UTF-8 para nombres de identificadores en GCC .

El informe de errores es de 2015 y tiene una discusión bastante larga. En algún momento , menciona que "no parece haber suficiente demanda para esta función, de modo que las empresas la financien o los voluntarios la implementen".

Por lo tanto, si encuentra este tema de buscando una solución, es posible que desee agregar a la discusión allí para mostrar que, de hecho, existe demanda.