2010-04-21 25 views
6

Tôi đang cố sử dụng tên biến unicode trong g ++.g ++ tên biến unicode

Dường như nó không hoạt động.

G ++ không hỗ trợ tên biến unicode, ... hoặc có một số tập con của unicode (mà từ đó tôi không thử nghiệm).

Cảm ơn!

+0

¤ g ++ không phải là tiêu chuẩn phù hợp với wrt. ký tự trong số nhận dạng. Nhưng tôi không biết của bất kỳ trình biên dịch * là * phù hợp. Đó là ấn tượng của tôi rằng hầu hết các trình biên dịch giới hạn ký tự nhận dạng sang tiếng Anh A ... Z và dấu gạch dưới, cộng với dấu $, điều này sai theo hai cách: không cho phép phạm vi khổng lồ các ký tự Unicode được chỉ định trong Phụ lục E của tiêu chuẩn (I ' đã liệt kê chúng tại http://pastie.org/3110152) và cho phép $, tiêu chuẩn không cho phép. Tóm lại, tiêu chuẩn và thực hành hiện tại là rất nhiều tỷ lệ cược. Có lẽ với C++ 11 ... ;-) Chúc mừng & hth., –

+0

@ Cheersandhth.-Alf Hãy thử clang :) –

Trả lời

8

Bạn cần phải xác định -fextended-identifiers cờ khi biên dịch, bạn cũng phải sử dụng \ uXXXX hoặc \ uXXXXXXXX cho unicode (ít nhất trong gcc nó unicode)

định danh (biến/tên lớp vv) trong g ++ có thể không được của utf-8/utf-16 hoặc bất cứ mã hóa, họ phải là:

identifier: 
    nondigit 
    identifier nondigit 
    identifier digit 

một nondigit là

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 

và unive rsalcharactername là

universalcharactername: 
    \UXXXXXXXX 
    \uXXXX 

Vì vậy, nếu bạn lưu tập tin nguồn của bạn như UTF-8, bạn không thể có một biến như ví dụ:

int høyde = 10; 

nó phải được viết ra như:

int h\u00F8yde = 10; 

(mà imo sẽ đánh bại toàn bộ mục đích - vì vậy chỉ cần gắn với az)

+3

Có hỗ trợ tốt hơn trong tiếng kêu không? – anon

+0

Tôi không biết, nhưng bạn nên hỏi một câu hỏi khác cho điều đó. – nos

+0

g ++ không phù hợp với tiêu chuẩn ở đây (nhưng không phải là các trình biên dịch khác, bao gồm Comeau).Đối với chuẩn C++, trong giai đoạn dịch đầu tiên "Mọi ký tự tệp nguồn không có trong bộ ký tự nguồn cơ bản (2.3) được thay thế bằng tên ký tự đại diện cho ký tự đó" và các quy tắc lexer hoạt động trên kết quả của cái đó. Trong tiêu chuẩn C++ 11, điều này được xác định trong mục "Giai đoạn dịch" §2.2/1 mục danh sách thứ nhất. –

4

Bản vá một dòng cho chuẩn bị cpp rocessor cho phép đầu vào UTF-8. Chi tiết cho gcc được nêu tại

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

tuy nhiên

, kể từ khi tiền xử lý được chia sẻ, bản vá tương tự nên làm việc cho g ++ là tốt. Cụ thể, bản vá cần thiết, như gcc-5.2 là

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; 

Lưu ý rằng bản vá trên cần phải được cài đặt hỗ trợ chuyển đổi C99. Nhập biểu tượng - danh sách để xác minh điều này, nếu không, bạn có thể cài đặt phiên bản mới của biểu tượngv cùng với gcc như được mô tả trong liên kết ở trên. Thay đổi lệnh cấu hình thành

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

nếu bạn đang xây dựng cho x86 và muốn bao gồm trình biên dịch C++.

Các vấn đề liên quan