2010-04-21 9 views
6

Próbuję użyć nazw zmiennych Unicode w g ++.g ++ nazwa zmiennej unicode

Wygląda na to, że nie działa.

Czy g ++ nie obsługuje nazw zmiennych Unicode, ... czy jest jakiś podzbiór kodu Unicode (z którego nie testuję).

Dzięki!

+0

¤ g ++ jest po prostu nie zgodny z normą. znaki w identyfikatorach. Ale nie znam żadnego kompilatora, który * jest * zgodny. Mam wrażenie, że większość kompilatorów ogranicza znaki identyfikatorów do angielskich znaków A ... Z i podkreślenia plus znak $, który jest błędny na dwa sposoby: nie pozwala na szeroki zakres znaków Unicode określonych w załączniku E do normy (I ' wymieniono je na stronie http://pastie.org/3110152) i dopuszczono $, na co standard nie zezwala. Krótko mówiąc, standardowa i istniejąca praktyka jest bardzo sprzeczna. Być może z C++ 11 ... ;-) Cheers & hth., –

+0

@ Cheersandhth.-Alf Spróbuj clang :) –

Odpowiedz

8

Musisz podać flagę -fextended-identifiers podczas kompilacji, trzeba także używać \ uXXXX lub \ uXXXXXXXX dla Unicode (conajmniej w gcc to Unicode)

identyfikatorów (zmiennych klasy nazw/etc) w g ++ nie może być UTF-8/UTF-16 lub jakiegokolwiek kodowania, muszą być:

identifier: 
    nondigit 
    identifier nondigit 
    identifier digit 

nondigit jest

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 

i Unive rsalcharactername jest

universalcharactername: 
    \UXXXXXXXX 
    \uXXXX 

Tak więc, jeśli zapiszesz plik źródłowy jako UTF-8, nie można mieć zmienną jak np

int høyde = 10; 

to musiało być napisane tak:

int h\u00F8yde = 10; 

(który imo pokonałby cały cel - więc po prostu trzymaj się z az)

+3

Czy jest lepsze wsparcie w klang? – anon

+0

Nie wiem, ale powinieneś o to poprosić. – nos

+0

g ++ nie jest zgodne ze standardem tutaj (ale nie są też inne kompilatory, w tym Comeau).Dla standardowego C++, w pierwszej fazie tłumaczenia "Każdy plik źródłowy, który nie znajduje się w podstawowym źródłowym zestawie znaków (2.3), jest zastępowany przez uniwersalną nazwę, która oznacza ten znak", a reguły leksykalne działają na wynik że. W standardzie C++ 11 jest to określone w "Fazach tłumaczenia" §2.2/1 1. pozycja listy. –

4

Jednoprzewodowa łatka do prepp cpp rocessor umożliwia wprowadzanie kodu UTF-8. Szczegóły dla gcc podano w

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

jednak, ponieważ preprocesor jest wspólna, ta sama poprawka powinna działać na g ++, jak również. W szczególności, plaster potrzebne, jak gcc-5.2 jest

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; 

Zauważ, że dla wyżej łatka do pracy, najnowsza wersja iconv musi być zainstalowany, który obsługuje konwersji C99. Wpisz iconv --list, aby to zweryfikować, w przeciwnym razie możesz zainstalować nową wersję iconv wraz z gcc, jak opisano w powyższym linku. Zmień komendę configure na

jeśli budujesz dla x86 i chcesz dołączyć również kompilator C++.

Powiązane problemy