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!
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!
È 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)
C'è un miglior supporto in clang? – anon
Non lo so, ma dovresti fare un'altra domanda per quello. – nos
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. –
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++.
¤ 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., –
@ Cheersandhth.-Alf Prova clang :) –