2010-12-12 9 views
94

अज्ञात नामस्थान static कीवर्ड से बेहतर कैसे हैं?स्थिर नाम से नामित नेमस्पेस की सुपीरियरता?

+0

हालांकि, नामांकित समिति के अनुसार, नामित नामस्थान _namespace-static_ के लिए पर्याप्त प्रतिस्थापन नहीं हैं। [अभी भी कुछ उदाहरण हैं] (http://stackoverflow.com/q/8460327/183120) जहां अनाम नामस्थान विफल हो जाते हैं और केवल 'स्थिर' काम करते हैं। – legends2k

उत्तर

100

आप मूल रूप से सी ++ स्टैंडर्ड से अनुभाग $ 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-namespacestatic से बेहतर क्यों है।

साथ ही, ध्यान दें कि नामस्थान स्कोप (मानक के अनुसार) में ऑब्जेक्ट्स घोषित करते समय स्थिर कीवर्ड का उपयोग बहिष्कृत किया जाता है।

+11

अधिक आम तौर पर, एक अनाम नामस्थान बाहरी लिंकेज की अनुमति देता है। यही कारण है कि स्थानीय-से-अनुवाद-इकाई वर्ग घोषणा को सक्षम बनाता है। यह भी अनुमति देता है उदा। टेम्पलेट तर्क के रूप में उपयोग करने के लिए बाहरी लिंकेज स्ट्रिंग निरंतर। –

+0

@ एएलएफ: यह सच है। इसके अलावा धन्यवाद। :-) – Nawaz

+9

जैसा कि आपके उत्तर में फ्रेड नर्क द्वारा उल्लेख किया गया है, ऐसा लगता है कि यह 'बहिष्कृत' टिप्पणी नवीनतम सी ++ 0x एफसीडी (एन 3225) से हटा दी गई थी। –

6

सी ++ स्टैंडर्ड खंड में पढ़ता 7.3.1.1 अनाम नामस्थान, पैरा 2:

static मुख्य शब्द के उपयोग जब एक नाम स्थान दायरे में वस्तुओं की घोषणा पदावनत है, बिना नाम-नाम स्थान एक प्रदान करता है बेहतर विकल्प

स्टेटिक केवल वस्तुओं, कार्यों और अज्ञात यूनियनों के नामों पर लागू होता है, घोषणाओं को टाइप न करने के लिए।

+1

नहीं, ऐसा नहीं है। एक मसौदा किया। और इसके बाद एक और मसौदा जल्द ही इस मूर्ख परिवर्तन को वापस कर दिया। –

5

वहाँ एक दिलचस्प इस से संबंधित समस्या है:

आप static कीवर्ड या अनाम namespace का उपयोग कुछ समारोह मॉड्यूल (अनुवाद इकाई) के लिए आंतरिक बनाने के लिए मान लीजिए, के बाद से इस समारोह द्वारा आंतरिक रूप से इस्तेमाल किया जा करने के लिए है मॉड्यूल और इसके बाहर सुलभ नहीं है। (अनाम namespace के पास डेटा बनाने और कार्यों के अलावा आंतरिक परिभाषाओं का भी लाभ है)।

समय के साथ आपके मॉड्यूल के कार्यान्वयन की स्रोत फ़ाइल बड़ी हो जाती है, और आप इसे कई अलग-अलग स्रोत फ़ाइलों में विभाजित करना चाहते हैं, जो कोड को व्यवस्थित करने, परिभाषाओं को तेज़ी से ढूंढने, और स्वतंत्र रूप से संकलित करने की अनुमति देगी ।

लेकिन अब आप एक समस्या का सामना: उन कार्यों को अब मॉड्यूल के लिए static हो सकता है क्योंकि static वास्तव में मॉड्यूल का उल्लेख नहीं है, लेकिन स्रोत फ़ाइल (अनुवाद इकाई) के लिए। आपको उन मॉड्यूल के अन्य हिस्सों (ऑब्जेक्ट फाइलों) से एक्सेस करने की अनुमति देने के लिए उन्हें गैर-static बनाने के लिए मजबूर होना पड़ता है। लेकिन इसका यह भी अर्थ है कि वे मॉड्यूल के लिए अब छुपा/निजी नहीं हैं: बाहरी संबंध होने के कारण, उन्हें अन्य मॉड्यूल से एक्सेस किया जा सकता है, जो आपकी मूल मंशा नहीं थी।

अनाम namespace इस समस्या को हल नहीं करेगा, क्योंकि इसे किसी विशेष स्रोत फ़ाइल (अनुवाद इकाई) के लिए भी परिभाषित किया गया है और इसे बाहर से नहीं पहुंचा जा सकता है।

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

+2

यह एक हैक और एक सीमित समाधान होगा, लेकिन आप सीपीपी फ़ाइल को आंतरिक स्थिर या नामित कार्यों के साथ अपनी 'मुख्य' सीपीपी फाइलों में शामिल कर सकते हैं। फिर इन 'उपग्रह' सीपीपी फ़ाइल को निर्माण से बाहर कर दें और आप कर चुके हैं। एकमात्र समस्या यदि आपके पास दो या दो से अधिक 'मुख्य' सीपीपी फ़ाइलें हैं और वे दोनों उस 'शांत' सीपीपी फ़ाइलों में से उस कूल फ़ंक्शन का उपयोग करना चाहते हैं ... – Sergey

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