2012-02-28 10 views
7

STLport पुस्तकालय में, मैं इस कोड को देखा था?
2. दुनिया में क्यों वे मूल नाम के स्थान पर लंबे उपनाम नाम का उपयोग करेंगे?एसटीएलपोर्ट: नेमस्पेस std {} का क्या अर्थ है?</p> <pre><code>namespace std { } namespace __std_alias = std; </code></pre> <p>1. वे पहली पंक्ति में मानक <code>std</code> नाम स्थान को रद्द कर कोशिश कर रहे हैं:

+5

'नेमस्पेस std {}' 'std' को रद्द नहीं करेगा, यह इसमें कुछ भी नहीं जोड़ देगा :) और, ज़ाहिर है, नाम को दायरे में लाएं। –

+0

ठीक है तो यह सिर्फ फ़ाइल के दायरे में लाने के लिए है और नामस्थान की सामग्री वही है। ब्रेसिज़ '{}' वहां रहने के लिए बस हैं। वे न तो नामस्थान में कुछ भी जोड़ते हैं और न ही वे कुछ भी लेते हैं। धन्यवाद! – Nav

उत्तर

8

इससे पहले कि आप इसे उपनाम घोषित कर सकें, आपको "स्कोप में" नामस्थान की आवश्यकता है। खाली namespace std {} संकलक को सूचित करता है कि नामस्थान मौजूद है। फिर वे इसके लिए उपनाम बना सकते हैं।

शॉर्टकट बनाने के अलावा उपनाम बनाने के कारण हैं। उदाहरण के लिए, आप नामस्थान को "नाम बदलें" के लिए एक मैक्रो परिभाषित कर सकते हैं - #define std STLPORT_std के प्रभाव पर विचार करें। उपनाम होने से आप मूल नामस्थान तक पहुंच सकते हैं बशर्ते आप हेडर फाइलों के साथ सही ऑर्डरिंग गेम खेलें।

3
  1. नहीं, यह सुनिश्चित करता है कि नामस्थान का नाम मौजूदा दायरे में उपलब्ध है। नामस्थान की सामग्री को प्रभावित किए बिना, आप किसी भी बिंदु पर नामस्थान खोल और बंद कर सकते हैं।

  2. मुझे लगता है, इसलिए वे ::std के अलावा नामस्थान में आसानी से बदल सकते हैं (__std_alias को किसी और चीज के लिए बदलकर)। यह उपयोगी होगा, उदाहरण के लिए, यदि आप एक दूसरे के साथ दो कार्यान्वयन का परीक्षण करना चाहते हैं।

0

क्या D.Shawley ने कहा, आगे एक वर्ग एक नाम स्थान के अंदर है कि घोषित करने के अलावा एक ही वाक्य रचना की आवश्यकता है:

namespace std 
{ 
    template <typename T> 
    class vector; 
} 
+0

आपके उदाहरण के साथ केवल समस्या यह है कि वेक्टर का दूसरा पैरामीटर, आवंटक है, इसलिए यह आगे की घोषणा आपको बाद में परेशानी में डाल सकती है। – CashCow

+0

मैं मानता हूं कि वेक्टर सबसे अच्छा उदाहरण नहीं है, मैं सिर्फ कुछ चाहता था जिसे हम सभी जानते हैं और प्यार करते हैं :) –

2

यह एक संकलक त्रुटि है कि वहाँ ऐसी कोई पाने के लिए नहीं बल्कि कष्टप्रद है एसएसडी के रूप में नामस्थान ... संकलक सोच क्या है? बेशक यह अस्तित्व में है!

वैसे हाँ यह करता है, लेकिन लाइब्रेरी सुविधाओं के साथ, इसे पहले घोषित किया जाना है। यही वह पंक्ति है जो पहली पंक्ति कर रही है।

__std_alias के नामकरण के साथ यह उन्हें नामस्थान में एक नया उपनाम देने की अनुमति देता है। आप किसी दिन अपने कोड में ऐसा करने का फैसला कर सकते हैं।

शायद आप अपने कोड में shared_ptr का उपयोग करना चाहते हैं, लेकिन नेमस्पेस बूस्ट या std का उपयोग करने के लिए अपने कोड को समर्पित नहीं करना चाहते हैं। तो आप या तो बूस्ट या std पर उपनाम बना सकते हैं, और "बिंदु" बना सकते हैं। अन्य सुविधाओं के साथ जो बूस्ट लाइब्रेरीज़ में हैं जो बाद में मानक बन गए।

यह आपको प्रत्येक नाम के लिए इस नामस्थान का उपयोग करने के लिए बाध्य नहीं करता है क्योंकि आपके पास एक से अधिक उपनाम हो सकते हैं, और आप एक से अधिक वास्तविक नामस्थान को इंगित कर सकते हैं।

मान लें कि हम अपने स्मार्ट पॉइंटर लाइब्रेरी एसएमएल को कॉल करना चाहते हैं। हम कोड (समान हेडर) में उस बिंदु से #include <boost/shared_ptr.hpp> कोड में एक ही स्थान पर और में

namespace sml = boost; // or std 

कर सकते हैं।

हमारे कोड में कहीं और हम sml::shared_ptr का उपयोग करते हैं। अगर हम कभी भी बूस्ट से एसडीडी में स्विच करते हैं, तो बस एक हेडर बदलें, न कि आपके सभी कोड।

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