2011-10-26 8 views
11

मैं यूबंटू लिनक्स पर विंडोज़ और जीसीसी पर माइक्रोसॉफ्ट विजुअल स्टूडियो का उपयोग कर सी ++ क्रॉस प्लेटफार्म विकसित करता हूं।क्या बीओएम स्रोत फाइलों के साथ यूटीएफ -8 संकलित करने के लिए जीसीसी प्राप्त करना संभव है?

दृश्य स्टूडियो में मैं अपने कोड में "π" और "²" की तरह यूनिकोड प्रतीकों का उपयोग कर सकते हैं। विजुअल स्टूडियो हमेशा स्रोत फ़ाइलों को बीओएम (बाइट ऑर्डर मार्क) के साथ यूटीएफ -8 के रूप में सहेजता है।

उदाहरण के लिए:

// A = π.r² 
double π = 3.14; 

जीसीसी खुशी से इन फ़ाइलों को संकलित करता है केवल अगर मैं बीओएम पहले हटा दें। मैं बीओएम को दूर नहीं करते हैं, मैं इस तरह की त्रुटियों मिलती है:

wwga_hydutils.cpp:28:9: error: stray ‘\317’ in program

wwga_hydutils.cpp:28:9: error: stray ‘\200’ in program

कौन सा मुझे प्रश्न के लिए लाता है:

वहाँ एक रास्ता जीसीसी पहले बीओएम निकाले बिना UTF-8 फ़ाइलों को संकलित करने के पाने के लिए है ?


मैं उपयोग कर रहा हूँ:

  • विंडोज 7
  • विजुअल स्टूडियो 2010

और:

  • Ubuntu oneiric 11.10
  • जीसीसी 4.6.1

संपादित करें (के रूप में द्वारा apt-get जीसीसी स्थापित प्रदान की गई):

के रूप में पहले टिप्पणीकार ने कहा, मेरी समस्या यह थी नहीं बीओएम, लेकिन होने स्ट्रिंग स्थिरांक के बाहर गैर-ascii वर्ण। जीसीसी को प्रतीक नामों में गैर-असीसी वर्ण पसंद नहीं हैं, लेकिन यह पता चला है कि जीसीसी बीओएम के साथ यूटीएफ -8 के साथ पूरी तरह से संगत है।

+2

वर्क्स ठीक कुछ कोशिश,। बीओएम के साथ फाइल करें। साथ ही, आपके द्वारा प्राप्त त्रुटि में बीओएम के साथ कुछ लेना देना नहीं है, लेकिन ऐसा लगता है कि प्रश्न में यूनिकोड वर्ण किसी भी स्ट्रिंग के बाहर हैं (यही कारण है कि उन्हें _stray_ कहा जाता है।) –

+0

@ जोचिमपिलबोर्ग हाँ यूनिकोड वर्ण स्ट्रिंग के बाहर हैं, "π" मैं प्रतीक नाम के रूप में उपयोग कर रहा था, "²" सिर्फ टिप्पणियों में था। जब मैं बीओएम को हटाता हूं, तो यह कंसोल आउटपुट से त्रुटि को खत्म करता है, लेकिन मुझे लगता है कि यह कोई गारंटी नहीं है कि जीसीसी वास्तव में पात्रों को संभालने में सक्षम है। – Boinst

+0

@ जोचिमपिलबोर्ग, मैंने उस संदर्भ को शामिल करने के लिए प्रश्न अपडेट किया है जिसमें मैं यूनिकोड वर्णों का उपयोग कर रहा हूं। – Boinst

उत्तर

2

GCC Wiki के अनुसार, यह अभी तक समर्थित नहीं है। आप -fextended-identifiers का उपयोग कर सकते हैं और पहचानकर्ताओं को यूसीएन में परिवर्तित करने के लिए अपने कोड को प्री-प्रोसेस कर सकते हैं। जुड़े हुए पृष्ठ से:

perl -pe 'BEGIN { binmode STDIN, ":utf8"; } s/(.)/ord($1) < 128 ? $1 : sprintf("\\U%08x", ord($1))/ge;' 

भी देखें g++ unicode variable name और Unicode Identifiers and Source Code in C++11?

3

यूनिकोड पहचानकर्ता जीसीसी में समर्थित नहीं हैं, UTF-8 इनपुट नहीं है। इसलिए, यूनिकोड पहचानकर्ताओं को \ uXXXX और \ UXXXXXXXX से बचने वाले कोड का उपयोग करके एन्कोड किया जाना है। हालांकि, सीपीपी प्रीप्रोसेसर के लिए एक साधारण एक-लाइन पैच यूटीएफ -8 इनपुट को संसाधित करने के लिए जीसीसी और जी ++ की अनुमति देता है, जिसमें सी 99 रूपांतरणों का समर्थन करने वाले आइकनव का हालिया संस्करण भी स्थापित किया गया है। विवरण

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

हालांकि में मौजूद हैं, पैच इतना आसान यह सही यहाँ दी जा सकती है।

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; 

पैच के साथ भी, यूटीएफ -8 इनपुट को सक्षम करने के लिए दो कमांड लाइन विकल्पों की आवश्यकता होती है। विशेष रूप से, एक स्ट्रिंग अपने प्रश्न में दोनों यूनिकोड वर्ण युक्त का उपयोग कर जीसीसी 4.4.5 में मेरे लिए की तरह

$ /usr/local/gcc-5.2/bin/gcc \ 
    -finput-charset=UTF-8 -fextended-identifiers \ 
    -o circle circle.c 
संबंधित मुद्दे

 संबंधित मुद्दे