2010-04-21 12 views
6

मैं g ++ में यूनिकोड चर नामों का उपयोग करने की कोशिश कर रहा हूं।g ++ यूनिकोड चर नाम

यह काम नहीं करता है।

क्या g ++ यूनिकोड चर नामों का समर्थन नहीं करता है ... या यूनिकोड का कुछ सबसेट है (जिसमें से मैं परीक्षण नहीं कर रहा हूं)।

धन्यवाद!

+0

¤ जी ++ मानक-अनुरूप wrt नहीं है। पहचानकर्ताओं में पात्र। लेकिन मुझे किसी भी कंपाइलर के बारे में पता नहीं है जो * अनुरूप है। यह मेरी धारणा है कि अधिकांश कंपाइलर पहचानकर्ता पात्रों को अंग्रेजी ए तक सीमित करते हैं ... ज़ेड और अंडरस्कोर, प्लस $ साइन, जो दो तरीकों से गलत है: मानक के अनुलग्नक ई में निर्दिष्ट यूनिकोड वर्णों की विशाल श्रृंखला को अनुमति नहीं देता है (I ' उन्हें http://pastie.org/3110152 पर सूचीबद्ध किया गया है), और $ को अनुमति देता है, जो मानक अनुमति नहीं देता है। संक्षेप में, मानक और मौजूदा अभ्यास बाधाओं पर बहुत अधिक है। शायद सी ++ 11 के साथ ... ;-) चीयर्स और एचटी।, –

+0

@ चीयर्संधथ-अल्फ कोशिश करें :) –

उत्तर

8

आप -fextended-identifiers झंडा जब संकलन, आप भी यूनिकोड के लिए \ uXXXX या \ uXXXXXXXX का उपयोग करने के बारे में बताने की

पहचानकर्ता ग्राम में (चर/वर्ग के नाम आदि) नहीं कर सकते (कम से कम जीसीसी में यह यूनिकोड है) ++ utf-8/UTF-16 या जो कुछ भी एन्कोडिंग, की हो वे होना जरूरी:

identifier: 
    nondigit 
    identifier nondigit 
    identifier digit 

एक 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 

और एक unive है rsalcharactername

universalcharactername: 
    \UXXXXXXXX 
    \uXXXX 

इस प्रकार है, यदि आप UTF-8 के रूप में अपने स्रोत फ़ाइल को बचाने के लिए, आप जैसे जैसे एक चर नहीं कर सकते हैं:

int h\u00F8yde = 10; 
:

int høyde = 10; 

यह था की तरह लिखा होना चाहिए

(जो आईएमओ पूरे उद्देश्य को हरा देगा - तो बस एज़ के साथ चिपके रहें)

+3

क्या क्लैंग में बेहतर समर्थन है? – anon

+0

मुझे नहीं पता, लेकिन इसके लिए आपको एक और सवाल पूछना चाहिए। – nos

+0

जी ++ मानक-अनुरूप नहीं है (लेकिन न तो अन्य कंपाइलर भी हैं, जिनमें कॉमौ भी शामिल है)।मानक सी ++ के लिए, अनुवाद के पहले चरण में "किसी भी स्रोत फ़ाइल वर्ण को मूल स्रोत वर्ण सेट (2.3) में नहीं बदला जाता है जो सार्वभौमिक-वर्ण-नाम द्वारा प्रतिस्थापित किया जाता है जो उस चरित्र को निर्दिष्ट करता है", और लेक्सर नियम परिणामस्वरूप संचालित होते हैं उस। सी ++ 11 मानक में यह "अनुवाद के चरण" §2.2/1 प्रथम सूची आइटम में निर्दिष्ट है। –

4

सीपीपी प्रीपे में एक लाइन पैच रोसेसर यूटीएफ -8 इनपुट की अनुमति देता है। जीसीसी के लिए विवरण

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

तथापि पर दिया जाता है, के बाद से पूर्वप्रक्रमक साझा किया जाता है, एक ही पैच के रूप में अच्छी तरह से जी ++ के लिए काम करना चाहिए। विशेष रूप से, पैच के रूप में, जरूरत जीसीसी-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; 

ध्यान दें कि ऊपर पैच काम करने के लिए, iconv का नवीनतम संस्करण स्थापित करने की C99 रूपांतरण का समर्थन करता है कि जरूरत है। इसे सत्यापित करने के लिए iconv --list टाइप करें, अन्यथा, आप उपरोक्त लिंक में वर्णित अनुसार जीसीसी के साथ iconv का एक नया संस्करण स्थापित कर सकते हैं। कॉन्फ़िगरेशन कमांड को

$ ../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 के लिए निर्माण कर रहे हैं और सी ++ कंपाइलर भी शामिल करना चाहते हैं।