2010-04-21 11 views
6

Estoy tratando de usar nombres de variables unicode en g ++.g ++ nombre de variable unicode

Parece que no funciona.

Does g ++ no admite nombres de variables Unicode, ... o hay algún subconjunto de Unicode (del cual no estoy probando).

Gracias!

+0

¤ g ++ simplemente no es wrt de conformidad con el estándar. caracteres en identificadores. Pero no sé de ningún compilador que * esté * conforme. Tengo la impresión de que la mayoría de los compiladores limitan los caracteres de identificación al inglés A ... Z y al guión bajo, más el signo $, lo cual es incorrecto de dos maneras: no permite el amplio rango de caracteres Unicode especificados en el anexo E del estándar (I ' los enumeró en http://pastie.org/3110152) y permite $, que el estándar no permite. En resumen, la práctica estándar y existente está en desacuerdo. Tal vez con C++ 11 ... ;-) Cheers & hth., –

+0

@ Cheersandhth.-Alf Probar clang :) –

Respuesta

8

tiene que especificar la bandera -fextended-identifiers al compilar, también hay que usar \ uXXXX o \ uXXXXXXXX para Unicode (al menos en gcc es Unicode)

identificadores (nombres de variables/clase etc.) en g ++ no puede ser de UTF-8/UTF-16 o lo que sea codificación, que tienen que ser:

identifier: 
    nondigit 
    identifier nondigit 
    identifier digit 

un no sea de dígito es

nondigit: one of 
    universalcharactername 
    _ a b c d e f g h i j k l m n o p q r s t u v w x y z 
    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 

y una unive rsalcharactername es

universalcharactername: 
    \UXXXXXXXX 
    \uXXXX 

Por lo tanto, si guarda el archivo de origen como UTF-8, no se puede tener una variable como por ejemplo:

int høyde = 10; 

que tenía que ser escrita como:

int h\u00F8yde = 10; 

(que imo vencería a todo el propósito, así que quédate con az)

+3

¿Hay mejor soporte en clang? – anon

+0

No lo sé, pero debe hacer otra pregunta para eso. – nos

+0

g ++ no cumple con los estándares aquí (pero tampoco lo son otros compiladores, incluido Comeau).Para C++ estándar, en la primera fase de la traducción "Cualquier carácter de archivo fuente que no esté en el juego de caracteres básicos de origen (2.3) se reemplaza por el nombre de carácter universal que designa ese carácter", y las reglas lexer operan en el resultado de ese. En el estándar C++ 11 esto se especifica en "Fases de la traducción" §2.2/1 1er elemento de la lista. –

4

Parche de una línea para la preparación de cpp rocessor permite la entrada UTF-8. Detalles para gcc se dan en

https://www.raspberrypi.org/forums/viewtopic.php?p=802657

sin embargo, desde el preprocesador es compartida, el mismo parche debería funcionar para g ++ también. En particular, el parche necesario, a partir de gcc-5.2 es

diff -cNr gcc-5.2.0/libcpp/charset.c gcc-5.2.0-ejo/libcpp/charset.c 
*** gcc-5.2.0/libcpp/charset.c Mon Jan 5 04:33:28 2015 
--- gcc-5.2.0-ejo/libcpp/charset.c Wed Aug 12 14:34:23 2015 
*************** 
*** 1711,1717 **** 
    struct _cpp_strbuf to; 
    unsigned char *buffer; 

! input_cset = init_iconv_desc (pfile, SOURCE_CHARSET, input_charset); 
    if (input_cset.func == convert_no_conversion) 
     { 
     to.text = input; 
--- 1711,1717 ---- 
    struct _cpp_strbuf to; 
    unsigned char *buffer; 

! input_cset = init_iconv_desc (pfile, "C99", input_charset); 
    if (input_cset.func == convert_no_conversion) 
     { 
     to.text = input; 

Tenga en cuenta que para el parche anterior funcione, una versión reciente de iconv necesita ser instalado que soporta conversiones C99. Escriba iconv --list para verificar esto, de lo contrario, puede instalar una nueva versión de iconv junto con gcc como se describe en el enlace de arriba. Cambiar el comando configure a

$ ../gcc-5.2.0/configure -v --disable-multilib \ 
    --with-libiconv-prefix=/usr/local/gcc-5.2 \ 
    --prefix=/usr/local/gcc-5.2 \ 
    --enable-languages="c,c++" 

si usted está construyendo para x86 y desea incluir el compilador de C++ también.

Cuestiones relacionadas