2010-04-21 71 views
6

我想在g ++中使用unicode變量名。g ++ unicode變量名

它似乎沒有工作。

g ++不支持unicode變量名稱,或者是否存在unicode的某個子集(從中我沒有測試)。

謝謝!

+0

g ++只是不符合標準的wrt。標識符中的字符。但我不知道任何*符合的編譯器。我的印象是,大多數編譯器將標識符字符限制爲英文A ... Z和下劃線加$符號,這在兩種方式上是錯誤的:不允許標準附錄E中指定的大量Unicode字符(I'已在http://pastie.org/3110152上列出),並允許標準不允許的$。總之,標準和現有的做法是非常不一致的。也許用C++ 11 ... ;-)乾杯&hth。, – 2012-01-02 03:33:33

+0

@ Cheersandhth.-Alf嘗試叮鐺:) – 2013-07-24 07:24:02

回答

8

您必須指定編譯,你也可以選擇使用爲\ uXXXX或\ uXXXXXXXX對Unicode當-fextended-identifiers標誌(ATLEAST在GCC它的Unicode)的

標識符以g(可變/類名等)++不能是UTF-8/UTF-16或任何編碼, 的他們必須是:

identifier: 
    nondigit 
    identifier nondigit 
    identifier digit 

非數字是

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 

和李海rsalcharactername是

universalcharactername: 
    \UXXXXXXXX 
    \uXXXX 

因此,如果你的源文件保存爲UTF-8,你不能有像例如一個變量:

int høyde = 10; 

它必須這樣寫:

int h\u00F8yde = 10; 

(imo會擊敗整個目的 - 所以只需堅持az)

+3

叮噹中是否有更好的支持? – anon 2010-04-21 10:27:29

+0

我不知道,但你應該問另一個問題。 – nos 2010-04-21 11:25:41

+0

g ++在這裏不符合標準(但其他編譯器,包括Comeau)也不符合標準。對於標準C++,在翻譯的第一階段「任何源文件字符都不在基本源字符集(2.3)中」被替換爲指定該字符的通用字符名稱「,並且詞法分析器規則對那。在C++ 11標準中,這是在「翻譯階段」§2.2/ 1第一個列表項中指定的。 – 2012-01-02 03:23:19

4

cpp prep的一行補丁rocessor允許UTF-8輸入。對於GCC細節在

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

然而

給出的,因爲預處理器被共享時,相同的補丁應爲克++正常工作。特別是,該補丁需要,作爲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; 

注意,對於以上補丁的工作,需要安裝支持C99轉換最近的iconv的版本。輸入iconv --list來驗證,否則,你可以安裝一個新版本的iconv和gcc,如上面的鏈接所述。更改配置命令爲

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

如果您正在爲x86構建並且還想包含C++編譯器。