स्थैतिक पर अनाम नामस्थान की श्रेष्ठता?


129

अनाम नामस्थान staticकीवर्ड से श्रेष्ठ कैसे हैं ?


हालाँकि, अनाम नामस्थान मानक समिति के अनुसार नामस्थान-स्थैतिक के लिए पर्याप्त प्रतिस्थापन नहीं हैं । अभी भी कुछ उदाहरण हैं जहां अनाम नामस्थान विफल होते हैं और केवल staticकाम करता है।
किंवदंतियों 2

जवाबों:


133

आप मूल रूप से C ++ 03 मानक से खंड §7.3.1.1 / 2 का उल्लेख कर रहे हैं,

स्थैतिक कीवर्ड का उपयोग वस्तुओं को किसी नेमस्पेस स्कोप में घोषित करते समय किया जाता है; अनाम-नेमस्पेस बेहतर विकल्प प्रदान करता है।

ध्यान दें कि यह पैराग्राफ पहले ही C ++ 11 में हटा दिया गया था। staticकार्य मानक के अनुसार नहीं रह गए हैं!

फिर भी, अनाम नाम स्थैतिक कीवर्ड से बेहतर हैं, मुख्य रूप से क्योंकि कीवर्ड staticकेवल चर घोषणाओं और कार्यों पर लागू होता है , उपयोगकर्ता-परिभाषित प्रकारों के लिए नहीं

C ++ में निम्न कोड मान्य है

   //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

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


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

10
जैसा कि आपके एक अन्य उत्तर पर फ्रेड नर्क ने उल्लेख किया है, ऐसा लगता है कि यह deprecatedटिप्पणी नवीनतम सी ++ 0x एफसीडी (एन 323) से हटा दी गई थी।
मैथ्यू एम।

36
आप स्वयं के प्रश्न का उत्तर दे रहे हैं और अपने आप को धन्यवाद कह रहे हैं: -o
manpreet singh

11
केवल वर्ग को वर्ग में परिभाषित करने से कोई अंतर नहीं होगा (कोई अनाम नामस्थान नहीं, कोई स्थिर नहीं)?
लुचियन ग्रिगोर

6
@LuchianGrigore 2 के मामले में मुसीबतों को जोड़ना .cppएक ही नाम के साथ एक वर्ग को परिभाषित कर रहा है।
Xaqq

8

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

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

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

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

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

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


3
यह वैसे भी एक हैक और एक सीमित समाधान होगा, लेकिन आप आंतरिक स्थैतिक या नाम स्थान वाले फ़ंक्शन के साथ cpp फ़ाइल (s) को अपनी 'मुख्य' cpp फ़ाइलों में शामिल कर सकते हैं। फिर इन 'उपग्रह' cpp फ़ाइल (ओं) को निर्माण से बाहर रखें और आप कर रहे हैं। एकमात्र समस्या अगर आपके पास दो या अधिक 'मुख्य' सीपीपी फाइलें हैं और वे दोनों 'सैटेलाइट' सीपीपी फाइलों में से एक से उस शांत फ़ंक्शन का उपयोग करना चाहते हैं ...
सर्गेई

स्थैतिक कार्यों के समाधान के साथ निजी / संरक्षित / सार्वजनिक के साथ विरासत का उपयोग नहीं कर रहा है?
अली

C ++ 20 मॉड्यूल का परिचय देता है, जो आपको समस्या हल करता है।
LF

4

C ++ मानक खंड .1.३.१.१ में पढ़ता है नामस्थान, पैरा २:

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

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


5
नहीं, यह नहीं है। एक ड्राफ्ट किया। और इसके तुरंत बाद एक और मसौदा इस मूर्खतापूर्ण परिवर्तन को वापस कर दिया।
अंडरस्कोर_ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.