2012-01-01 8 views
8

कल्पना के अनुसार, प्रमुख अंडरस्कोर से वैश्विक नामों की अनुमति नहीं:वैश्विक दायरे में अज्ञात नेमस्पेस के अंदर नाम अंडरस्कोर अग्रणी हैं?

17.4.3.1.2 वैश्विक नाम
- प्रत्येक नाम उस के साथ एक अंडरस्कोर में एक नाम के रूप में उपयोग के लिए कार्यान्वयन के लिए आरक्षित है शुरू होता है वैश्विक नामस्थान।

क्या यह शीर्ष-स्तर के अनाम नामस्थान में परिभाषित नामों के लिए भी लागू होता है?

+0

बेस्ट पर, वास्तव में, वास्तव में खराब रूप होगा यदि आपने अपने किसी भी परिवर्तनीय नाम पर अग्रणी अंडरस्कोर का उपयोग करने का निर्णय लिया है। – paulsm4

+1

@ paulsm4 यह है कि बूस्ट बाइंड लाइब्रेरी तर्क प्लेसहोल्डर्स को परिभाषित करने के लिए करता है ('_1',' _2', आदि ...)। – StackedCrooked

+2

एक अनाम नामस्थान विशेष रूप से विशेष नहीं है; यह केवल एक सामान्य, विशिष्ट नामित नेमस्पेस है जिसका उपयोग निर्देश का उपयोग करके एक निहित है जो इसके नामों को संलग्न नामस्थान में इंजेक्ट करता है। हालांकि, यहां एक दिलचस्प सवाल है: क्या इस नाम का उल्लंघन करने के माध्यम से वैश्विक नामस्थान में नाम लाया जा सकता है? –

उत्तर

3

हां। लेकिन वह उद्धरण उस पते को संबोधित नहीं करता है (जैसा कि आप इसे स्वयं जानते हैं)।

यहाँ मुझे लगता है कि के लिए लागू होता है:

17.4.3.1.3 बाहरी लिंकेज

3। प्रत्येक नाम में लगातार दो अंडरस्कोर (2.11) दोनों बाहरी "सी" और बाहरी "सी ++" लिंक के साथ नाम के रूप में उपयोग के लिए कार्यान्वयन के लिए आरक्षित है।

मैं इसे चर बाहरी लिंकेज, अनाम नाम स्थान में साथ घोषित करने के लिए लागू होता है लगता है, लेकिन यह ध्यान दिया जाना चाहिए कि यह के बारे में डबल अंडरस्कोर बात करती है। तो:

namespace 
{ 
    std::string __s1; //not allowed 
    std::string _s2; //allowed (allowed, as I understand) 
} 

एक अधिक सामान्य विषय: एक प्रमुख के साथ शुरू

+0

इसके अलावा, 'std :: string _S3;' की अनुमति नहीं होगी। –

+0

@JamesMcNellis: आपका मतलब है '_s2' की अनुमति है, लेकिन' _S3' नहीं है (अपरकेस पर जोर देना)? Spec से कौन सा कथन इसे मना करता है? – Nawaz

+0

उस प्रश्न के स्वीकृत उत्तर में पहले उद्धरण में पहला बुलेट बिंदु देखें जिसे आप लिंक करते हैं। –

6

नाम एक गैर राजधानी अक्षरांकीय चरित्र के बाद अंडरस्कोर और एक डबल अंडरस्कोर सहित न केवल आरक्षित हैं वैश्विक नामस्थान में। इसका कारण यह है कि कुछ प्रणालियों पर कुछ नामों को अग्रणी अंडरस्कोर प्राप्त करने की आवश्यकता होती है या इन्हें पहले से ही अंतर्निहित ऑपरेटिंग सिस्टम और/या इसकी सी लाइब्रेरी द्वारा उपयोग किया जाता है। अज्ञात नेमस्पेस में नामों में यह समस्या नहीं है।

उसने कहा, मैं हमेशा सोच रहा हूं कि लोग बदसूरत नामों का उपयोग करने के लिए इतने उत्सुक क्यों हैं! जब तक कि मैं मानक लाइब्रेरी कार्यान्वयन मोड में नहीं हूं (जहां मुझे प्रभावी रूप से बदसूरत नामों का उपयोग करना पड़ता है, न कि मैं उपयोगकर्ता नामों के साथ संघर्ष करता हूं) मैं हमेशा सोच रहा हूं कि क्या मैं अपने कोड में कहीं भी एक अग्रणी अंडरस्कोर का उपयोग करके कुछ गलत कर रहा हूं! ऐसे दुर्लभ मौके हैं जहां एक अग्रणी अंडरस्कोर की आवश्यकता होती है (उदाहरण के लिए _exit() पर कॉल करते समय या std::bind() के प्लेसहोल्डर का उपयोग करते हुए) लेकिन आम तौर पर उपयोगकर्ताओं को उन्हें छूना नहीं चाहिए: न ही उनका उपयोग करें और उन्हें परिभाषित न करें।

+2

मैं यहां व्यक्त भावना से पूरी तरह से सहमत हूं। मुझसे + 1', मुझे पता है कि [सी ++ चैट रूम] (http://chat.stackoverflow.com/rooms/10/loungec) में चर्चा से सवाल उठ गया है, न कि क्योंकि उपयोग करने के लिए ढेर उन नामों, लेकिन चूंकि ऐसे प्रश्न हजारों अन्य उपयोगकर्ताओं द्वारा देखे जाते हैं, इसलिए मुझे कम से कम इसका उल्लेख करना महत्वपूर्ण लगता है। – sbi

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