2017-01-04 8 views
6

मुझे पूरा यकीन है कि विजुअल सी ++ 2015 में एक बग है, लेकिन मुझे 100% यकीन नहीं है।स्ट्रिंग शाब्दिक concatenation (अनुवाद के सी ++ 11 चरण 6) के लिए सही व्यवहार

कोड:

// Encoding: UTF-8 with BOM (required by Visual C++). 
#include <stdlib.h> 

auto main() 
    -> int 
{ 
    auto const s = L"" 
     " is not in the Unicode BMP!"; 
    return s[0] > 256? EXIT_SUCCESS : EXIT_FAILURE; 
} 

जी के साथ ++ परिणाम:

 
[H:\scratchpad\simple_text_io] 
> g++ --version | find "++" 
g++ (i686-win32-dwarf-rev1, Built by MinGW-W64 project) 6.2.0 

[H:\scratchpad\simple_text_io] 
> g++ compiler_bug_demo.cpp 

[H:\scratchpad\simple_text_io] 
> run a 
Process exit code = 0. 

[H:\scratchpad\simple_text_io] 
> _ 

विज़ुअल सी के साथ ++ परिणाम:

 
[H:\scratchpad\simple_text_io] 
> cl /nologo- 2>&1 | find "++" 
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23026 for x86 

[H:\scratchpad\simple_text_io] 
> cl compiler_bug_demo.cpp /Feb 
compiler_bug_demo.cpp 
compiler_bug_demo.cpp(8): warning C4566: character represented by universal-character-name '\U00010437' cannot be represented in the current code page (1252) 

[H:\scratchpad\simple_text_io] 
> run b 
Process exit code = 1. 

[H:\scratchpad\simple_text_io] 
> _ 

कोई यूबी शामिल है, और नहीं, संकलक सही ढंग से कार्य जो करता है, तो ?

परिशिष्ट:

व्यवहार दोनों compilers के लिए अपरिवर्तित है लोअरकेस ग्रीक पीआई उपयोग करते हैं, “ π ”, जो बीएमपी में है, ताकि कोई फर्क नहीं लगता है।

+0

मैं कहने वाला था "वीसी ++ गलत है क्योंकि §2.14.5, आइटम 13", लेकिन चरित्र के आस-पास के नियम हमेशा मुझे भ्रमित करते हैं। – molbdnilo

+0

वीएस 2015 अपडेट 3 ('माइक्रोसॉफ्ट (आर) सी/सी ++ एक्सप्लोरिंग कंपाइलर संस्करण 1 9 .00.24213.1 x86' के लिए) इसे कोई त्रुटि या चेतावनी के साथ संकलित करता है; मैंने Emacs में 'utf-8-unix' कोडिंग सिस्टम में फ़ाइल को सहेजा। वीएस का कौन सा संस्करण आपके पास विशेष रूप से है? – legends2k

+0

@ legends2k: प्रश्न में उदाहरण संस्करण सूचीबद्ध करता है। –

उत्तर

1

[lex.string] से:

  1. अनुवाद चरण 6 में, आसन्न स्ट्रिंग शाब्दिक श्रेणीबद्ध कर रहे हैं। यदि दोनों स्ट्रिंग अक्षरों में एक ही एन्कोडिंग-उपसर्ग है, परिणामी समेकित स्ट्रिंग अक्षरक में एन्कोडिंग-उपसर्ग है। यदि एक स्ट्रिंग अक्षर में कोई एन्कोडिंग-उपसर्ग नहीं है, तो इसे अन्य ऑपरेटिंग के समान एन्कोडिंग-उपसर्ग के स्ट्रिंग अक्षर के रूप में माना जाता है। यदि एक यूटीएफ -8 स्ट्रिंग शाब्दिक टोकन एक विस्तृत स्ट्रिंग शाब्दिक टोकन के निकट है, तो कार्यक्रम खराब हो गया है। कोई अन्य संगतता सशर्त रूप से कार्यान्वयन-परिभाषित व्यवहार के साथ समर्थित हैं। [नोट: यह समापन एक व्याख्या है, रूपांतरण नहीं। चूंकि अनुवाद चरण 6 में व्याख्या होती है ( के बाद एक शाब्दिक से प्रत्येक वर्ण को उचित वर्ण सेट से मूल्य में अनुवादित किया गया है), एक स्ट्रिंग शाब्दिक प्रारंभिक कच्चेपन के संयोजन की व्याख्या या अच्छी तरह से गठबंधन पर कोई प्रभाव नहीं पड़ता है। -डे नोट] तालिका 8 में वैध concatenations के कुछ उदाहरण हैं।

तो वहाँ कोई यूबी यहाँ चरण 5 है, लेकिन अनुवाद की पहले से ही कुछ पात्रों के मूल्यों परिवर्तित हो सकता है:

  1. प्रत्येक स्रोत वर्ण सेट सदस्य चरित्र शाब्दिक या स्ट्रिंग शाब्दिक, साथ ही साथ प्रत्येक अक्षर अनुक्रम और सार्वभौमिक-चरित्र-नाम एक अक्षर शाब्दिक या गैर-कच्चे स्ट्रिंग अक्षर में सदस्य है, कोर में परिवर्तित किया गया है निष्पादन चरित्र सेट के स्पॉन्डिंग सदस्य यदि कोई संबंधित सदस्य नहीं है, तो इसे शून्य (विस्तृत) वर्ण के अलावा कार्यान्वयन-परिभाषित सदस्य में परिवर्तित किया जाता है।
+0

के साथ एक ही मामला है हां, चरण 5 चीज मेरे लिए अस्पष्ट नहीं है। इस समय तक सभी बुनियादी स्रोत चरित्र सेट वर्णों का अनुवाद (प्रभावी रूप से) यूनिकोड में किया गया है, लेकिन "स्रोत चरित्र सेट" वर्ण छोड़े जा सकते हैं जो "मूल स्रोत वर्ण सेट" में नहीं हैं? जी ++ और विजुअल सी ++ के बीच एक अंतर यह है कि जी ++ यूटीएफ -8 को इसके निष्पादन चरित्र सेट के रूप में डिफ़ॉल्ट करता है, जबकि विजुअल सी ++ विंडोज एएनएसआई (मेरे केस कोडपेज 1252 में) के लिए डिफ़ॉल्ट होता है। लेकिन इस तरह के अनुवाद सामान्य रूप से व्यापक स्ट्रिंग अक्षर के साथ कहर बरबाद कर देगा! –

+0

@ चीयर्संधथ.-अल्फ यह जानबूझकर अस्पष्ट रूप से अस्पष्ट है कि कार्यान्वयन को सीमित न करें जो वे समर्थन करते हैं और क्या नहीं। उदाहरण के लिए, आप बीएमपी से नहीं वर्णों को अनदेखा करने के लिए 16 बिट चौड़े वर्णों के साथ कंपाइलर प्राप्त कर सकते हैं। (जो यहां हो सकता है) –

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