C ++ में पहचानकर्ताओं में सार्वभौमिक चरित्र नामों का उपयोग क्या है


11

सी ++ मानक (मैं इसे नया एक में देखा है, लेकिन यह पहले से ही किया C ++ 03 मौजूद हैं) सार्वभौमिक चरित्र के नाम, के रूप में लिखा निर्दिष्ट करता है \uNNNNऔर \UNNNNNNNNऔर यूनिकोड कोड पॉइंट्स के साथ पात्रों का प्रतिनिधित्व NNNN/ NNNNNNNN। यह विशेष रूप से UTF-8, UTF-16 और UCS-4 स्ट्रिंग शाब्दिक के रूप में परिभाषित किया गया है, विशेष रूप से स्ट्रिंग शाब्दिक के साथ उपयोगी है। हालांकि, पहचानकर्ताओं में सार्वभौमिक चरित्र शाब्दिकों की भी अनुमति है। उसके पीछे क्या प्रेरणा है?

वाक्यविन्यास स्पष्ट रूप से पूरी तरह से अपठनीय है, पहचानकर्ताओं को लिंकर के लिए मंगवाया जा सकता है और ऐसा नहीं है कि किसी भी नाम से प्रतीकों को प्राप्त करने के लिए कोई मानक कार्य था। तो क्यों कोई वास्तव में एक सार्वभौमिक चरित्र शाब्दिक पहचानकर्ता का उपयोग करेगा?

संपादित करें: चूंकि यह वास्तव में C ++ 03 में पहले से मौजूद था, इसलिए अतिरिक्त प्रश्न यह होगा कि क्या आपने वास्तव में इसका उपयोग करने वाला कोड देखा है?

जवाबों:


6

अद्यतन - यह जवाब, हालांकि यह मेरे और दूसरों के लिए समझ में आता था, यह काफी हद तक गलत निकला (और इरादे के बारे में पर्याप्त रूप से गलत है, जैसा कि प्रभावी रूप से सिर्फ सादा गलत है)। चूंकि (एपीग्रामग्राम की एक टिप्पणी में कहा गया है) यह स्ट्रिंग स्थिरांक के बाहर यूसीएस का उपयोग करने की अनुमति नहीं है, जब एक ही चरित्र को सामान्य रूप से आधार चरित्र सेट में दर्शाया जा सकता है। इसलिए, इसका उपयोग कीवर्ड से बचने के लिए नहीं, जैसा कि मेरे उदाहरण में है; और इसका उपयोग करके 'पहचानकर्ताओं' की तरह 23skiddoबचकर भागना नहीं है2। यह अभी भी बाहरी भाषाओं के साथ संगत नाम बनाने के लिए इस्तेमाल किया जा सकता है, मुझे लगता है, लेकिन केवल, ऐसा लगता है, जब वे नाम या तो एक अक्षर या एक विस्तारित चरित्र के साथ शुरू होते हैं, और केवल अक्षर, अंक, रेखांकित और विस्तारित वर्ण होते हैं - जो कि इरादे का ठीक से समर्थन करने के लिए बहुत अधिक प्रतिबंधात्मक लगता है। इसलिए यह होना चाहिए कि पहचानकर्ताओं में इन अतिरिक्त पात्रों की अनुमति देने के लिए और स्रोत संपादकों को जहां इन अक्षरों को रेखांकन रूप से प्रदर्शित किया जाता है, को सक्षम करने के लिए मुख्य आशय (AProgrammer के उत्तर में) है, जबकि अभी भी स्रोत फ़ाइल को सादे ASCII में रखने की अनुमति है।


C ++ प्रोग्राम अन्य भाषाओं में लिखे गए कार्यों को कह सकते हैं। मानकीकरण समिति की ओर से यह सुनिश्चित करना अच्छी रणनीति है कि C ++ अन्य भाषाओं के साथ परस्पर क्रियाशील होगी जो फ़ंक्शन नामों में गैर-अल्फ़ान्यूमेरिक्स या यूनिकोड वर्ण की अनुमति दे सकती है, भले ही ऐसी भाषाएँ अभी भी मौजूद न हों। मानक को यह निर्दिष्ट करने की आवश्यकता नहीं है कि यह लिंकर स्तर पर कैसे काम करेगा, आदि; लेकिन इसकी अनुमति देने के लिए एक निर्दिष्ट तंत्र होना अच्छा है।

इसके लिए उपयोग देखने के लिए आपको भविष्य में देखने की आवश्यकता नहीं है। मान लीजिए कि मेरे पास एक पुरानी सी लाइब्रेरी है, जिसमें एक फंक्शन है, जिसे catch(या संरक्षित, या म्यूटेबल) कहा जाता है ... और मैं इसे C ++ से कॉल करना चाहता हूं। और जिस भी कारण से मैं C कोड को संशोधित नहीं करना चाहता या नहीं कर सकता (वैसे, मेरे पास पुराने C कोड से निपटने के लिए एक से अधिक बार एक फ़ंक्शन नाम का उपयोग किया गया था जो C ++ कीवर्ड बन गया था ...)

UC नामों के साथ मैं इसे हेडर में लिख सकता हूं, और उसके बाद बस 'catch_func ()' कहूंगा।

extern "C" {
       int catc\u0068( int a, int b );  // C 'catch()' function
}
inline int catch_func( int a, int b ) { return catc\u0068(a,b); }

यकीन है कि यह बदसूरत है, लेकिन इससे कोई फर्क नहीं पड़ता क्योंकि यह हेडर में केवल एक जगह है। अन्य भाषाओं में कॉल फ़ंक्शंस के लिए स्टब्स बनाने के लिए एक ही दृष्टिकोण का उपयोग किया जा सकता है, और काम करता है, भले ही नाम सी ++ कीवर्ड या यूनिकोड, या रिक्त स्थान हो, .या अन्य विराम चिह्न उनमें एम्बेडेड हों।

विभिन्न अन्य भाषाओं में ऐसे उपकरण होते हैं जो पहचानकर्ताओं के निर्माण की अनुमति देते हैं जो सामान्य पैटर्न का पालन नहीं करते हैं; Verilog में उदाहरण के लिए, \abcdकरने के लिए एक पहचानकर्ता के बराबर है abcd, लेकिन \whileऔर \23skidooऔर \44.e2पहचानकर्ता भी है, जो बैकस्लैश उपसर्ग इस तरह के रूप में देखा जा करने की जरूरत है। वेरिलोग का उपयोग करने के तरीके के कारण, किसी भी नाम की अनुमति देना महत्वपूर्ण है, जहां वे बाहरी इंटरफेस से संबंधित हैं।


दिलचस्प उपयोग मामला। हालांकि मुझे संदेह है (जब संभव हो) नाम का अनुवाद करने के लिए एक छोटी सी फ़ाइल लिखना अच्छा होगा (और इस तरह C ++ पहचानकर्ता का उपयोग कर सकते हैं) और C ++ को उस C फ़ंक्शन को कॉल करना होगा।
थॉमस एडिंग

1
आप यह नहीं लिख सकते हैं कि दो कारणों से, पहले UCS स्ट्रिंग और चरित्र शाब्दिक के बिना मूल सेट में चरित्र को संदर्भित नहीं कर सकते हैं कार्यक्रम को विकृत किए बिना, दूसरा अगर वह खंड मौजूद नहीं था UCS अनुवाद के चरण 1 में संभाला जाता है और इस प्रकार मूल सेट में एक चरित्र को संदर्भित करने वाले UCS और स्वयं वर्ण के बीच निपटने में कोई अंतर नहीं होगा।
APgramgrammer

4

यह एक सिस्टम को पहचानकर्ता में यूनिकोड वर्णों को किसी भी मानक अनुरूप संकलक पर संकलित प्रारूप में निर्यात करने की अनुमति देता है। IE यह मूल चरित्र सेट पर यूनिकोड को एन्कोड करने का एक तरीका है (अधिक या कम जैसे उद्धृत-प्रिंट करने योग्य ईमेल के लिए उपयोग किया जाता है, जो सिस्टम बेहतर जानते हैं वे बेहतर काम करने में सक्षम हैं, अन्य सिस्टम अभी भी काम कर रहे हैं)।


2

कोई विदेशी भाषा वर्ण का उपयोग करके एक पहचानकर्ता बनाना चाहेगा जो कीबोर्ड या इनपुट डिवाइस पर एंटर करने योग्य नहीं है। वैकल्पिक रूप से, पहचानकर्ता में एक चरित्र हो सकता है जो डिवाइस के फ़ॉन्ट या आउटपुट क्षमताओं का उपयोग करके प्रिंट करने योग्य नहीं है, लेकिन आईडीई एक सटीक प्रतिनिधित्व दिखाना चाहता है।


4
पहले मामले में, पहचानकर्ता उस चरित्र के होने जैसा नहीं लगेगा, इसलिए कोड अपठनीय होगा और पहचानकर्ता वास्तव में मशीन के लिए मायने नहीं रखता है। और दूसरे के लिए, आईडीई में प्रतिनिधित्व एक पूरी तरह से अलग समस्या है।
Jan Hudec

1

C ++ के लिए आवश्यक है कि स्रोत में शाब्दिक रूप से दिखने वाले वास्तविक विस्तारित वर्णों को यूनिवर्सल कैरेक्टर नाम के साथ पहचाना जाए। पहचानकर्ताओं में यूनिवर्सल कैरेक्टर नाम देने से प्रोग्रामर को पहचानकर्ताओं में विस्तारित पात्रों का उपयोग करने की अनुमति मिलती है।


यह वास्तविक विस्तारित वर्ण समर्थित हैं, उन्हें इसी सार्वभौमिक वर्ण के रूप में व्यवहार करना होगा। लेकिन उनका समर्थन नहीं किया जाना चाहिए।
Jan Hudec

1
यह सच है, लेकिन यह उस बिंदु को याद करता है, जो यह है कि यदि समिति यह निर्दिष्ट करना चाहती है कि विस्तारित वर्णों का समर्थन करने वाले कार्यान्वयन को पहचानकर्ताओं में उन वर्णों का उपयोग करने में समर्थन करना चाहिए, तो पहचान में UCNs की अनुमति की आवश्यकता होती है। आइसी यूसीएन को पहचानकर्ताओं में अनुमति दी जाती है, जरूरी नहीं कि यह इतना पठनीय हो और हर कोई हेक्साडेसिमल में मैन्युअल रूप से एन्कोडिंग नामों से प्यार करता हो, लेकिन क्योंकि अगर कल्पना विस्तारित वर्णों को पहचानकर्ताओं में उपयोग करने की अनुमति देना चाहता है तो यह निर्दिष्ट करके ऐसा करता है कि पहचानकर्ताओं में यूसीवी की अनुमति है।
bames53
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.