2012-10-28 13 views
6

के सी ++ 11 मानक से निम्नलिखित उद्धरण (the N3376 draft, सटीक होना करने के लिए) पर विचार करें:उपयोगकर्ता परिभाषित स्ट्रिंग साहित्य बनाम। अन्य उपयोगकर्ता निर्धारित Literals

(2.14.8.5)

तो एल एक उपयोगकर्ता के डी फाई ned- है स्ट्रिंग-शाब्दिक, इसके ud-su ffi x के बिना शाब्दिक होना चाहिए और अंत में कोड इकाइयों की संख्या (यानी, लंबाई को समाप्त करने वाले शून्य वर्ण को छोड़कर) दें। शाब्दिक एल प्रपत्र की एक कॉल के रूप में व्यवहार किया जाता है

 operator "" X (str , len) 

जबकि उपयोगकर्ता परिभाषित शाब्दिक (फ्लोटिंग प्वाइंट, पूर्णांक, चरित्र) के सभी अन्य प्रकार के लिए लंबाई के साथ पारित कर दिया कभी नहीं है, भले ही शाब्दिक खुद को एक स्ट्रिंग के रूप में पारित किया जाता है। उदाहरण के लिए:

42_zzz; // calls operator "" _zzz("42") and not operator "" _zzz("42", 2) 

स्ट्रिंग और गैर-स्ट्रिंग उपयोगकर्ता परिभाषित अक्षरों के बीच यह अंतर क्यों है? या मुझे कहना चाहिए, कार्यान्वयन यूडी स्ट्रिंग अक्षर के लिए लेन कैसे पास करता है? लम्बाई, जैसा कि अन्य शाब्दिकों के मामले में, शून्य-समाप्ति द्वारा घटाया जा सकता है। मैं क्या खो रहा हूँ?

+0

शायद एन्कोडिंग/चरित्र सेट के साथ कुछ करने के लिए। अन्य पैराग्राफ से पहले सभी में "[नोट: अनुक्रम सी 1 सी 2 ... सीके में केवल मूल स्रोत चरित्र सेट से वर्ण हो सकते हैं। - अंत नोट]"। – Mat

+0

@Mat: लेकिन अन्य एन्कोडिंग या चरित्र सेट के साथ तार अभी भी निरस्त नहीं हैं, है ना? –

+0

शून्य-समाप्ति पर्याप्त नहीं है। मुझे लगता है कि "मूल स्रोत चरित्र सेट" में '\ 0' शामिल नहीं है। – Mat

उत्तर

8

एक स्ट्रिंग अक्षर के लिए यह उचित रूप से कल्पना करने योग्य है कि स्ट्रिंग के अनुक्रम में एक शून्य वर्ण एम्बेडेड है, उदाहरण के लिए, "a\0b"। क्रियान्वयन को पूरे स्ट्रिंग का उपयोग करने की अनुमति देने के लिए, यहां तक ​​कि यदि एक एम्बेडेड नल चरित्र है, तो उसे शाब्दिक की लंबाई जानने की आवश्यकता है। उपयोगकर्ता द्वारा परिभाषित अक्षर के लिए अन्य रूपों में एम्बेडेड शून्य वर्ण नहीं हो सकते हैं।

+0

संयोग से, सी 99 में भी एक मैक्रो को परिभाषित करना संभव है, जब एक पहचानकर्ता के साथ बुलाया जाता है और एक स्ट्रिंग शाब्दिक एक संकलन-समय निरंतर संरचना बनाएगा जिसमें उस नाम के साथ स्ट्रिंग की लंबाई होती है जिसमें स्ट्रिंग का टेक्स्ट होता है लेकिन पीछे नहीं शून्य (सुनिश्चित नहीं है कि यह सी 11 के तहत साफ संकलित कर सकता है)। सुनिश्चित नहीं है कि उपयोगकर्ता द्वारा परिभाषित-स्ट्रिंग-शाब्दिक प्रकार C++ में ऐसी कोई चीज़ संभव होगी, लेकिन ऐसा होने पर यह आसान लगेगा। – supercat

+0

@supercat: मैं विवाद नहीं कर रहा हूं कि आप * स्ट्रिंग अक्षर की लंबाई निर्धारित कर सकते हैं। हालांकि, अगर आप केवल 'char const *' पास करते हैं तो आप स्ट्रिंग अक्षर की लंबाई निर्धारित नहीं कर सकते हैं! एक नल चरित्र ढूंढकर आकार निर्धारित करने का पारंपरिक तरीका केवल पहले शून्य चरित्र तक स्ट्रिंग का आकार निर्धारित करता है। किसी भी तरह स्ट्रिंग अक्षर का आकार आवश्यक है (जो मैक्रो आप वर्णन करते हैं वह भी इस पर निर्भर करता है: शाब्दिक में वर्ण की संख्या निर्धारित करने के लिए यह केवल 'आकार (शाब्दिक) -1' का उपयोग करता है (पीछे की ओर \ 0' को छोड़कर) –

+0

बेशक, स्ट्रिंग का आकार आवश्यक है, यही कारण है कि मैंने जिस संरचना का उल्लेख किया है वह स्ट्रिंग से पहले रखता है; मेरा मुद्दा यह था कि सी मैक्रो में भी एक शाब्दिक स्ट्रिंग की लंबाई को पूर्णांक स्थिरांक के रूप में उपयोग कर सकता है। संयोग से , मेरे कोड ने विभिन्न मैक्रोज़ का उपयोग किया जो स्ट्रिंग 0-63 बाइट्स, 0-2047, या 0-16777215 [1, 2, या 4 बाइट उपसर्ग का उपयोग करके] पर आधारित विभिन्न संरचनाएं उत्पन्न करते हैं। सीमाओं को प्रारंभ करने के लिए मैक्रोज़ भी हैं- एक, दो, और चार-बाइट उपसर्गों के साथ स्ट्रिंग बफर की जांच की गई। स्ट्रिंग हैंडलिंग विधियां उपसर्ग प्रकार को स्वतः पहचानें, और यह भी ... – supercat

6

स्ट्रिंग्स हमेशा उस में C/C समाप्त कर दिया जाता अशक्त ++ लेकिन इसका मतलब यह है कि वे कभी नहीं एम्बेडेड न हों \0 चरित्र, आप "1234\05678" हो सकता है और जब तक इस स्ट्रिंग शून्य समाप्त हो जाता है, यह एक अतिरिक्त शामिल '\ 0`।

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