2010-04-21 5 views
6

Je tente d'utiliser des noms de variables unicode en g ++.g ++ unicode nom de la variable

Il ne semble pas fonctionner.

Est-ce que g ++ ne supporte pas les noms de variables unicode, ... ou est-il un sous-ensemble de unicode (dont je ne suis pas dans le test).

Merci!

+0

¤ g ++ est tout simplement pas conforme à la norme WRT. caractères dans les identifiants. Mais je ne connais aucun compilateur qui soit * conforme *. J'ai l'impression que la plupart des compilateurs limitent les caractères d'identification à l'anglais A ... Z et au soulignement, plus le signe $, ce qui est faux de deux façons: ne pas autoriser l'énorme gamme de caractères Unicode spécifiés dans l'annexe E de la norme Nous les avons listés sur http://pastie.org/3110152), et en autorisant $, ce que la norme ne permet pas. En bref, la pratique standard et existante est très en désaccord. Peut-être avec C++ 11 ... ;-) Cheers & hth., –

+0

@ Cheersandhth.-Alf Essayez clang :) –

Répondre

8

Vous devez spécifier le -fextended-identifiers drapeau lors de la compilation, vous devez également utiliser \ uXXXX ou \ uXXXXXXXX pour unicode (atleast dans gcc il est unicode)

Identifiers (variables/noms de classes, etc.) en g ++ ne peut pas être utf-8/UTF-16 ou quel que soit le codage, ils doivent être:

identifier: 
    nondigit 
    identifier nondigit 
    identifier digit 

un non numérique est

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 

et un unive rsalcharactername est

universalcharactername: 
    \UXXXXXXXX 
    \uXXXX 

Ainsi, si vous enregistrez votre fichier source en UTF-8, vous ne pouvez pas avoir une variable comme par exemple:

int høyde = 10; 

il devait être écrit comme:

int h\u00F8yde = 10; 

(qui imo battre tout le but - si juste tenir à az)

+3

Y at-il un meilleur soutien en clang? – anon

+0

Je ne sais pas, mais vous devriez poser une autre question à ce sujet. – nos

+0

g ++ n'est pas conforme à la norme ici (mais ne sont autres compilateurs, y compris Comeau).Pour le C++ standard, dans la toute première phase de traduction "Tout caractère de fichier source ne figurant pas dans le jeu de caractères de base (2.3) est remplacé par le nom de caractère universel qui désigne ce caractère", et les règles lexer cette. Dans la norme C++ 11, ceci est spécifié dans "Phases de traduction" §2.2/1 1er élément de la liste. –

4

un patch d'une ligne à la préparation cpp Le processeur permet l'entrée UTF-8. Détails pour gcc sont donnés à

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

cependant, le préprocesseur est partagée, le même patch devrait fonctionner pour g ++ ainsi. En particulier, le patch nécessaire, au-gcc 5.2 est

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; 

Notez que pour le patch ci-dessus fonctionne, une version récente de iconv doit être installé qui prend en charge les conversions C99. Tapez iconv --list pour vérifier cela, sinon, vous pouvez installer une nouvelle version de iconv avec gcc comme décrit dans le lien ci-dessus. Modifier la commande configure pour

$ ../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 vous construisez pour x86 et que vous voulez inclure le compilateur C++ ainsi.