अज्ञात नामस्थान static
कीवर्ड से बेहतर कैसे हैं?स्थिर नाम से नामित नेमस्पेस की सुपीरियरता?
उत्तर
आप मूल रूप से सी ++ स्टैंडर्ड से अनुभाग $ 7.3.1.1/2 की चर्चा करते हुए कर रहे हैं,
static मुख्य शब्द के उपयोग जब एक नाम स्थान दायरे में वस्तुओं की घोषणा पदावनत है ; अनाम नाम-नाम एक बेहतर विकल्प प्रदान करता है।
बेनाम नाम स्थान static मुख्य शब्द से बेहतर है, इसका मुख्य कारण कीवर्ड static
उपयोगकर्ता परिभाषित प्रकार को न केवल चर के घोषणाओं और कार्यों लागू होती है।
निम्नलिखित कोड सी ++
//legal code
static int sample_function() { /* function body */ }
static int sample_variable;
में मान्य है लेकिन इस कोड मान्य नहीं है:
//illegal code
static class sample_class { /* class body */ };
static struct sample_struct { /* struct body */ };
तो समाधान है, अनाम-नाम स्थान है, जो इस है,
//legal code
namespace
{
class sample_class { /* class body */ };
struct sample_struct { /* struct body */ };
}
उम्मीद है कि यह बताता है कि unnamed-namespace
static
से बेहतर क्यों है।
साथ ही, ध्यान दें कि नामस्थान स्कोप (मानक के अनुसार) में ऑब्जेक्ट्स घोषित करते समय स्थिर कीवर्ड का उपयोग बहिष्कृत किया जाता है।
अधिक आम तौर पर, एक अनाम नामस्थान बाहरी लिंकेज की अनुमति देता है। यही कारण है कि स्थानीय-से-अनुवाद-इकाई वर्ग घोषणा को सक्षम बनाता है। यह भी अनुमति देता है उदा। टेम्पलेट तर्क के रूप में उपयोग करने के लिए बाहरी लिंकेज स्ट्रिंग निरंतर। –
@ एएलएफ: यह सच है। इसके अलावा धन्यवाद। :-) – Nawaz
जैसा कि आपके उत्तर में फ्रेड नर्क द्वारा उल्लेख किया गया है, ऐसा लगता है कि यह 'बहिष्कृत' टिप्पणी नवीनतम सी ++ 0x एफसीडी (एन 3225) से हटा दी गई थी। –
सी ++ स्टैंडर्ड खंड में पढ़ता 7.3.1.1 अनाम नामस्थान, पैरा 2:
static मुख्य शब्द के उपयोग जब एक नाम स्थान दायरे में वस्तुओं की घोषणा पदावनत है, बिना नाम-नाम स्थान एक प्रदान करता है बेहतर विकल्प
स्टेटिक केवल वस्तुओं, कार्यों और अज्ञात यूनियनों के नामों पर लागू होता है, घोषणाओं को टाइप न करने के लिए।
नहीं, ऐसा नहीं है। एक मसौदा किया। और इसके बाद एक और मसौदा जल्द ही इस मूर्ख परिवर्तन को वापस कर दिया। –
वहाँ एक दिलचस्प इस से संबंधित समस्या है:
आप static
कीवर्ड या अनाम namespace
का उपयोग कुछ समारोह मॉड्यूल (अनुवाद इकाई) के लिए आंतरिक बनाने के लिए मान लीजिए, के बाद से इस समारोह द्वारा आंतरिक रूप से इस्तेमाल किया जा करने के लिए है मॉड्यूल और इसके बाहर सुलभ नहीं है। (अनाम namespace
के पास डेटा बनाने और कार्यों के अलावा आंतरिक परिभाषाओं का भी लाभ है)।
समय के साथ आपके मॉड्यूल के कार्यान्वयन की स्रोत फ़ाइल बड़ी हो जाती है, और आप इसे कई अलग-अलग स्रोत फ़ाइलों में विभाजित करना चाहते हैं, जो कोड को व्यवस्थित करने, परिभाषाओं को तेज़ी से ढूंढने, और स्वतंत्र रूप से संकलित करने की अनुमति देगी ।
लेकिन अब आप एक समस्या का सामना: उन कार्यों को अब मॉड्यूल के लिए static
हो सकता है क्योंकि static
वास्तव में मॉड्यूल का उल्लेख नहीं है, लेकिन स्रोत फ़ाइल (अनुवाद इकाई) के लिए। आपको उन मॉड्यूल के अन्य हिस्सों (ऑब्जेक्ट फाइलों) से एक्सेस करने की अनुमति देने के लिए उन्हें गैर-static
बनाने के लिए मजबूर होना पड़ता है। लेकिन इसका यह भी अर्थ है कि वे मॉड्यूल के लिए अब छुपा/निजी नहीं हैं: बाहरी संबंध होने के कारण, उन्हें अन्य मॉड्यूल से एक्सेस किया जा सकता है, जो आपकी मूल मंशा नहीं थी।
अनाम namespace
इस समस्या को हल नहीं करेगा, क्योंकि इसे किसी विशेष स्रोत फ़ाइल (अनुवाद इकाई) के लिए भी परिभाषित किया गया है और इसे बाहर से नहीं पहुंचा जा सकता है।
यह बहुत अच्छा होगा अगर कोई यह निर्दिष्ट कर सके कि namespace
private
है, जो कि इसमें परिभाषित किया गया है, इसका मतलब मॉड्यूल द्वारा आंतरिक रूप से उपयोग किया जाना है। लेकिन निश्चित रूप से सी ++ में "मॉड्यूल" जैसी ही अवधारणा नहीं है, केवल "अनुवाद इकाइयां", जो स्रोत फ़ाइलों से कसकर बंधी हुई हैं।
यह एक हैक और एक सीमित समाधान होगा, लेकिन आप सीपीपी फ़ाइल को आंतरिक स्थिर या नामित कार्यों के साथ अपनी 'मुख्य' सीपीपी फाइलों में शामिल कर सकते हैं। फिर इन 'उपग्रह' सीपीपी फ़ाइल को निर्माण से बाहर कर दें और आप कर चुके हैं। एकमात्र समस्या यदि आपके पास दो या दो से अधिक 'मुख्य' सीपीपी फ़ाइलें हैं और वे दोनों उस 'शांत' सीपीपी फ़ाइलों में से उस कूल फ़ंक्शन का उपयोग करना चाहते हैं ... – Sergey
- 1. नामित कॉलम नाम
- 2. सी ++ नेमस्पेस और स्थिर चर
- 3. नेमस्पेस का नाम बदलना
- 4. निर्धारित स्थिर नामित JavaScript फ़ंक्शन त्रुटियों
- 5. नामस्थानों का नाम एक ही चर के साथ नामित नेमस्पेस है
- 6. स्थिर वर्ग डेटा बनाम अज्ञात नेमस्पेस सी ++
- 7. एक्सएसडी नेमस्पेस से सी # नेमस्पेस
- 8. रूट नेमस्पेस और असेंबली नाम
- 9. टाइप या नेमस्पेस नाम 'न्यूटॉन्सॉफ्ट' नहीं मिला
- 10. टाइप या नेमस्पेस नाम 'webmethod' नहीं मिला
- 11. टाइप या नेमस्पेस नाम 'कॉलम' नहीं मिला
- 12. निर्देशिका संरचना से फ़ाइलों की प्रतिलिपि बनाएँ लेकिन नामित फ़ोल्डर
- 13. नेमस्पेस std में स्ट्रिंग का नाम
- 14. सेल की नामित श्रेणी कैसे खोजें - VSTO
- 15. जावा कोई नाम स्थिर विधि
- 16. नेमस्पेस
- 17. नेमस्पेस
- 18. भाषाएं जो नामित tuples
- 19. नेमस्पेस शुद्धता
- 20. एक्सएमएल नेमस्पेस 'क्लियर-नेमस्पेस: YYY'
- 21. आयात बिना पैकेज का नाम स्थिर
- 22. अनियमित स्थिर साइको :: सिक (नाम त्रुटि)
- 23. गैर स्थिर चर नाम एक स्थिर संदर्भ से संदर्भित नहीं किया जा सकता
- 24. एक स्थिर समारोह में नाम स्थान प्राप्त
- 25. WCF नामित पाइप कम से कम उदाहरण
- 26. एक्सएमएल नेमस्पेस घोषणा: ऑटो-विकल्प पैकेज का नाम
- 27. नामित गुंजाइश - बाँध चर की गलत संख्या
- 28. System.Web.Webpages.Html बनाम सिस्टम.Web.Mvc नेमस्पेस
- 29. त्रुटि -: अनियमित स्थिर एयरब्रैक (नाम त्रुटि)
- 30. नामित रेंज स्कोप
हालांकि, नामांकित समिति के अनुसार, नामित नामस्थान _namespace-static_ के लिए पर्याप्त प्रतिस्थापन नहीं हैं। [अभी भी कुछ उदाहरण हैं] (http://stackoverflow.com/q/8460327/183120) जहां अनाम नामस्थान विफल हो जाते हैं और केवल 'स्थिर' काम करते हैं। – legends2k