2010-04-21 21 views
6

Sto cercando di utilizzare nomi di variabili unicode in g ++.g ++ nome variabile unicode

Non sembra funzionare.

g ++ non supporta nomi di variabili unicode, ... o c'è qualche sottoinsieme di unicode (dal quale non sto testando).

Grazie!

+0

¤ g ++ non è solo standard wrt conforme. caratteri negli identificatori. Ma non conosco alcun compilatore che * sia * conforme. La mia impressione è che molti compilatori limitino i caratteri identificativi all'inglese A ... Z e al carattere di sottolineatura, più il segno $, che è sbagliato in due modi: non permettendo l'enorme gamma di caratteri Unicode specificati nell'allegato E dello standard (I ' li ho elencati su http://pastie.org/3110152), e permettendo $, che lo standard non consente. In breve, la pratica standard ed esistente è molto in disaccordo. Forse con C++ 11 ... ;-) Saluti e hth., –

+0

@ Cheersandhth.-Alf Prova clang :) –

risposta

8

È necessario specificare il flag -fextended-identifiers durante la compilazione, si hanno anche per usare \ uXXXX o \ uXXXXXXXX per unicode (almeno in gcc E 'Unicode)

identificatori (nomi delle variabili/classe ecc) a g ++ non può essere di utf-8/utf-16 o qualsiasi codifica, devono essere:

identifier: 
    nondigit 
    identifier nondigit 
    identifier digit 

un tranne le cifre è

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 

e unive rsalcharactername è

universalcharactername: 
    \UXXXXXXXX 
    \uXXXX 

Quindi, se si salva il file di origine come UTF-8, non si può avere una variabile come ad esempio:

int høyde = 10; 

doveva essere scritto come:

int h\u00F8yde = 10; 

(che imo avrebbe battuto l'intero scopo - quindi basta attaccare con az)

+3

C'è un miglior supporto in clang? – anon

+0

Non lo so, ma dovresti fare un'altra domanda per quello. – nos

+0

g ++ non è conforme allo standard qui (ma nemmeno altri compilatori, incluso Comeau).Per il C++ standard, nella primissima fase della traduzione "Qualsiasi carattere del file sorgente non nel set di caratteri sorgente di base (2.3) è sostituito dal nome-carattere universale che designa quel carattere", e le regole del lexer operano sul risultato di quella. Nello standard C++ 11 questo è specificato in "Fasi di traduzione" §2.2/1 prima voce dell'elenco. –

4

Una patch su una riga per la preparazione di cpp rocessor consente l'input UTF-8. Dettagli per gcc sono espressi per

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

tuttavia, dal momento che il preprocessore è condivisa, la stessa patch dovrebbe funzionare per g ++ pure. In particolare, la patch necessaria, a partire da gcc-5.2 è

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; 

Si noti che per quanto sopra patch per lavorare, una versione recente di iconv deve essere installata che supporta la conversione C99. Digita iconv --list per verificare ciò, altrimenti, puoi installare una nuova versione di iconv insieme a gcc come descritto nel link sopra. Modificare il comando configure su

$ ../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++" 

se si sta creando per x86 e si desidera includere anche il compilatore C++.