2012-10-02 20 views
45

Soy para encontrar que no puedo usar como un identificador válido con g ++ 4.7, incluso con la opción -fextended-identifiers habilitado:(y otros caracteres Unicode) en identificadores no permitidos por g ++

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

main.cpp:3:3: error: stray ‘\360’ in program
main.cpp:3:3: error: stray ‘\237’ in program
main.cpp:3:3: error: stray ‘\230’ in program
main.cpp:3:3: error: stray ‘\203’ in program

Después de buscar en Google, descubrí que UTF-8 characters are not yet supported in identifiers pero un universal-character-name debería funcionar. Así que puedo convertir mi fuente a:

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

Así que al parecer no es un carácter 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().

Por lo tanto, en aras de nombres de variables significativos y descriptivos, ¿qué ofrece? ¿-fextended-identifiers hace lo que anuncia o no? ¿Solo se admite en la versión más reciente? ¿Y qué tipo de soporte tienen otros compiladores?

+0

Leer [esto] (http:.//www.learncpp.com/cpp-tutorial/22-keywords-and-naming-identifiers/). – ErikEsTT

+0

@ErikEsTT Lamentablemente, esa página no menciona que un identificador puede contener un 'universal-character-name', así que cualquier consejo ceden a las convenciones de nomenclatura, no tienen en cuenta la importancia de usar caras sonrientes como nombres de variables. Consulte la §2.11 de ISO/IEC 14882: 2011 (E). –

+2

Hmm, parece que el programa 'static const char * x =" I estoy muy feliz ";' crash clang 3.1 ... – kennytm

Respuesta

15

A partir de 4.8, gcc does not support characters outside of the BMP used as identifiers. Parece ser una restricción innecesaria. Además, gcc solo es compatible con un conjunto de caracteres muy restringido descrito en ucnid.tab, basado en C y C++ (parece que no está actualizado a C11 y C++ 11).

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


Editar:

GCC apoya el carácter C11 establece starting from 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 real usando para trabajar incluso con -finput-charset=UTF-8 con GCC 7 en https://gcc.godbolt.org (puede querer seguir this bug report, provisto por @DanielWolf).

Mientras tanto, ambas piezas de código funcionan en clang 3.3 sin más opciones que -std=c++11.

+0

¿Qué tal 'main.cpp: 3: 15: error: carácter universal \ u00a8 no es válido en un identificador'? Esto es con 4.7, sin embargo. –

+1

@sftrabbit: compruebe la actualización. U + 00A8 no era parte de C++ 98/03. – kennytm

4

However, the standard specifically allows characters from the range 10000-1FFFD in Annex E.1 and doesn't disallow it as an initial character in E.2.

Una cosa a tener en cuenta es que sólo porque el estándar de C++ permite (o rechaza) alguna característica, no significa necesariamente que los soportes del compilador (o no admite) esa característica.

+0

Sí, permitiendo que el conjunto completo de caracteres Unicode especificados por el estándar sea uno que, hasta donde yo sé, aún no hay compiladores compatibles, ya sea literalmente o con UCN. – bames53

+1

¡Por supuesto! Solo quise encontrar documentación o fuente que demuestre que no son compatibles con esta característica. –

+1

@sftrabbit Bien, tal vez mi respuesta es señalar lo obvio. KennyTM dio el enlace re: gcc. –

4

Este es un error conocido en GCC: Bug 67224 - UTF-8 support for identifier names in GCC.

El informe de error es de 2015 y tiene una discusión bastante larga. En some point, menciona que "No parece que haya suficiente demanda para esta función, de modo que las empresas la financien o los voluntarios la implementen."

Así que si has encontrado este tema Stackoverflow en busca de una solución, es posible que desee agregar a la discusión de allá para demostrar que no es, de hecho, la demanda

Cuestiones relacionadas