(निम्नलिखित में,
स्ट्राइक-थ्रू
चीजें ऐसी चीजें हैं जो अब सी ++ 11 पर लागू नहीं होती हैं, लेकिन सी ++ 03 पर लागू होती हैं। सी ++ 11 अब लगभग कोई अंतर नहीं बनाता है (यदि वहां है हैं, वे सिर्फ भाषा वकील मतभेद हैं जिन्हें मैं याद नहीं कर सकता)।)।
अनाम नाम एक पहचानकर्ता
प्रभावी ढंग से
अनुवाद इकाई स्थानीय बनाने के लिए उपयोगिता है। वे के रूप में यदि आप एक नाम स्थान के लिए प्रति अनुवाद इकाई एक अद्वितीय नाम का चयन करेंगे व्यवहार करते हैं:
namespace unique { /* empty */ }
using namespace unique;
namespace unique { /* namespace body. stuff in here */ }
खाली शरीर का उपयोग कर अतिरिक्त कदम, महत्वपूर्ण है तो आप पहले से ही ::name
तरह पहचानकर्ता के नाम स्थान शरीर के भीतर का उल्लेख कर सकते परिभाषित कर रहे हैं कि उस नामस्थान में, क्योंकि उपयोग निर्देश पहले से ही हुआ था।
इसका मतलब है आप नि: शुल्क कार्य (उदाहरण के लिए) help
कहा जाता है कि कई अनुवाद इकाइयों में मौजूद कर सकते हैं हो सकता है, और वे अपने अद्वितीय नाम स्थान वे कर रहे हैं की वजह से, लिंक समय में टकराव नहीं होगा
बाद से वे सभी एक अद्वितीय नाम मिला
में। प्रभाव सी में प्रयुक्त static
कीवर्ड का उपयोग करने के लगभग समान है जिसे आप पहचानकर्ताओं की घोषणा में डाल सकते हैं।
static
उस तरीके से उपयोग किया जाता है जिसे सी ++ में बहिष्कृत किया जाता है, क्योंकि
अनाम नामस्थान एक बेहतर विकल्प हैं, जो एक प्रकार का अनुवाद इकाई स्थानीय भी बना सकते हैं।
namespace { int a1; }
static int a2;
दोनों a
के अनुवाद इकाई स्थानीय कर रहे हैं और कड़ी समय में टकराव नहीं होगा। लेकिन अंतर यह है कि अज्ञात नेमस्पेस
में
a1
बस
एक अद्वितीय नाम प्राप्त करता है।
यह अभी भी बाहरी जुड़ाव है और इसे बनाए जा रहे ऑब्जेक्ट फ़ाइल की प्रतीक तालिका में निर्यात किया जा सकता है।
template<int * ptr> struct sample { };
// OK - a1 has external linkage
sample<&a1> s1;
// NOT OK - translation unit locality is done by giving a2 internal linkage.
sample<&a2> s2;
खाका मापदंडों इसलिए इस मामले में पहचानकर्ता एक अनाम नाम स्थान में डाल दिया गया है बाह्य संबंध होना आवश्यक है: यदि आप एक टेम्पलेट तर्क के रूप में अपने पते का उपयोग करना चाहते हैं तो यह महत्वपूर्ण हो जाता है।
आउ-कंप्यूटिंग `Why is an unnamed namespace used instead of static? पर उत्कृष्ट लेख पढ़ें।
स्रोत
2008-12-10 20:19:20
क्या यह वास्तव में "अभी भी बाहरी संबंध है"? 3.5/4 ऐसा सुझाव देता है कि अज्ञात नेमस्पेस में सब कुछ आंतरिक जुड़ाव हो जाता है ...? –
@kerr no मेरा उत्तर पुराना है। मुझे इसे सी ++ 11 के लिए अपडेट करने की आवश्यकता होगी। धन्यवाद –
@ जोहान्सचैब-लिटब: धन्यवाद। मुझे लगता है कि मैं जाकर [इस विषय पर मेरा उत्तर] (http://stackoverflow.com/a/12539201/596781) तो हटाने होंगे, क्योंकि यह एकमुश्त गलत है। –