2010-04-21 20 views
6

Unicode değişken adlarını g ++ içinde kullanmaya çalışıyorum.g ++ unicode değişken adı

Çalışmıyor gibi görünmüyor.

g ++ unicode değişken adlarını desteklemiyor mu, yoksa unicode'un bir alt kümesi var mı?

Teşekkürler!

+0

¤ g ++ standart olarak uygun değildir. tanımlayıcılarda karakterler. Ama herhangi bir derleyiciyi bilmiyorum * * uygun. Çoğu derleyicinin betimleyici karakterleri İngilizce A ... Z ve alt çizgi ile artı işareti olarak iki şekilde sınırladığı karakterleri sınırlandırıyor: standart E Ekinde belirtilen çok sayıda Unicode karakterine izin vermiyor (I ' ve bunları http://pastie.org/3110152 adresinde listelediler ve standartların izin vermediği $ a izin verdiler. Kısacası, standart ve mevcut uygulama oldukça fazladır. Belki C++ 11 ile ;-) Cheers & hth., –

+0

@ Cheersandhth.-Alf Deneyin clang :) –

cevap

8

Sen de unicode için \ uXXXX veya \ uXXXXXXXX kullanmak zorunda derleme -fextended-identifiers bayrağı belirtmek zorunda ++ g

Tanımlayıcılar (değişken/sınıf isimleri vs.) olamaz (en az gcc o unicode var) uTF-8/uTF-16 ya da her türlü kodlama olması bunlar olmak zorunda:

identifier: 
    nondigit 
    identifier nondigit 
    identifier digit 

bir nondigit

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 

ve Unive olduğu

int h\u00F8yde = 10; 
: o vardı

int høyde = 10; 

gibi yazılacak: rsalcharactername UTF-8 olarak kaynak dosyasını kaydetmek varsa, örneğin böyle bir değişkeni olamaz, Böylece

universalcharactername: 
    \UXXXXXXXX 
    \uXXXX 

olduğunu

(hangi imo tüm amacı yener - bu yüzden az miktarda yapışır)

+3

Clang daha iyi destek var mı? – anon

+0

Bilmiyorum, ama bunun için başka bir soru sormalısın. – nos

+0

g ++, burada standart olarak uygun değildir (ancak Comeau dahil olmak üzere başka derleyiciler de değildir).Standart C++ için, çevirinin ilk aşamasında "Temel kaynak karakter kümesinde (2.3) bulunmayan herhangi bir kaynak dosya karakteri, bu karakteri tanımlayan evrensel karakter ismiyle değiştirilir" ve lexer kuralları, söyledi. C++ 11 standardında bu, "çevirinin fazları" §2.2/1 1. liste maddesinde belirtilmiştir. –

4

Cpp hazırlaması için tek satırlık bir yama Rocessor, UTF-8 girişine izin verir. gcc için ayrıntılar önişlemci paylaşıldığı için, aynı yama yanı g ++ için çalışmalı,

ancak

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

de verilmektedir. Özellikle, yama itibariyle gerekli gcc-5.2 Yukarıdaki yama çalışması için, iconv bir son hali C99 dönüşümleri destekleyen yüklü olması gerektiğini

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; 

Not olduğunu. Bunu doğrulamak için iconv --list yazın, aksi halde, yukarıdaki linkte açıklandığı gibi gcc ile birlikte iconv'nin yeni bir sürümünü yükleyebilirsiniz. Eğer x86 bina ve hem de C++ derleyici eklemek istediğiniz takdirde

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

için configure komutunu değiştirin.