C ++ में, "नाम स्थान उपनाम" क्या है?


जवाबों:


186

एक नामस्थान उपनाम किसी भिन्न, छोटे नाम द्वारा लंबे नामस्थान नाम का संदर्भ देने का एक सुविधाजनक तरीका है।

एक उदाहरण के रूप में, मान लें कि आप बिना किसी using namespaceनिर्देश के बूस्ट के यूबीएलएएस से संख्यात्मक वैक्टर का उपयोग करना चाहते थे । हर बार पूरा नामपट्ट लगाना बोझिल है:

boost::numeric::ublas::vector<double> v;

इसके बजाय, आप के लिए एक उपनाम परिभाषित कर सकते हैं boost::numeric::ublas- कहते हैं कि हम इसे केवल संक्षिप्त करना चाहते हैं ublas:

namespace ublas = boost::numeric::ublas;


ublas::vector<double> v;

7
संभवतः व्याख्या करने के लिए, SO नहीं है और कभी भी एक अच्छा C ++ पाठ्यपुस्तक का प्रतिस्थापन नहीं होगा। आपके द्वारा पूछे गए प्रश्न का उत्तर ऐसी किसी भी पुस्तक द्वारा दिया जाएगा। और अपने स्वयं के सवालों के जवाब देने के लिए एसओ "सुविधा" का उपयोग ऐसी पुस्तकों के पैराफ्रीज़ प्रदान करने के लिए नहीं किया जाना चाहिए।

24
कोई अपराध नहीं हुआ ... बस यह बताने के लिए कि मैंने ऐसा क्यों किया: पॉडकास्ट में जोएल की टिप्पणियों से मेरी समझ यह थी कि "एंट्री-लेवल" प्रश्न भी एसओ पर उचित खेल थे, और यह एक सवाल पूछने और इसका जवाब देने के लिए स्वीकार्य था यदि वह सामग्री अभी तक SO पर नहीं है तो एक सुलभ रूप में। लेकिन जाहिरा तौर पर, इस पर भरोसा है?
मार्टिन बी

1
जलन से बचने के लिए निश्चित रूप से अपने स्वयं के प्रश्न का उत्तर देने के लिए एक शिष्टाचार है; इस मामले में, यह बहुत स्पष्ट है कि यह कभी भी एक वास्तविक प्रश्न नहीं था । उदाहरण के लिए, stackoverflow.com/questions/494927/…
मार्क ग्रेवेल

6
@ मर्टिन बी: ​​मैं इस बात से सहमत नहीं हूं कि यह एक प्रवेश स्तर का प्रश्न है - वास्तव में अतीत में कई वोटों के साथ अब तक पूछे गए स्पष्ट प्रश्न हैं। यह कहने के बाद, लोग महसूस कर सकते हैं कि आप केवल अपने लिए प्रतिष्ठा प्राप्त करने की कोशिश कर रहे हैं इस तरह एक प्रश्न या उत्तर "समुदाय विकि" के रूप में एक या दोनों को चिह्नित करना है। व्यक्तिगत रूप से मैं आपके साथ प्रश्न के रूप में जाऊंगा और समुदाय के रूप में उत्तर दूंगा। यदि प्रश्न में मेरिट है तो आपको ROI मिलेगा।
रिचर्ड कॉर्डन

1
मुझे लगता है कि महत्वपूर्ण प्रश्न यह है कि क्या प्रश्न वास्तविक है - क्या यह कुछ ऐसा है जो आपसे पूछा गया है? क्या यह ऐसा कुछ है जो लोग जानना चाहते हैं? क्या यह ऐसा कुछ है जो पहले से ही एसओ पर नहीं पूछा गया है और इसका उत्तर दिया गया है? यदि आप पढ़ते हैं R समुदाय पोस्टिंग के बारे में SO ब्लॉग पोस्ट और यहां दिए गए सवालों के जवाब, ध्यान दें कि उन्होंने उन शीर्ष X प्रश्नों को उठाया था जो उनके समुदाय वास्तव में पूछते रहते थे , इसलिए इसकी वास्तविक-विश्व प्रासंगिकता थी। भाषा-विशिष्ट ज्ञान के यादृच्छिक स्निपेट लेना और उन्हें यहां पोस्ट करना प्रतीत होता है। कम उपयोगी।
jalf

7

काफी बस, # काम नहीं करेगा।

namespace Mine { class MyClass { public: int i; }; }
namespace His = Mine;
namespace Yours { class Mine: public His::MyClass { void f() { i = 1; } }; }

संकलन ठीक है। आपको नामस्थान / वर्ग नाम टकराव के आसपास काम करने देता है।

namespace Nope { class Oops { public: int j; }; }
#define Hmm Nope
namespace Drat { class Nope: public Hmm::Oops { void f () { j = 1; } }; }

अंतिम पंक्ति पर, "हम्म: ऊप्स" एक संकलन त्रुटि है। पूर्व-प्रोसेसर इसे Nope :: Oops में बदल देता है, लेकिन Nope पहले से ही एक वर्ग का नाम है।


3
क्या #define? शायद आपका जवाब प्रश्न के पिछले संस्करण को संदर्भित करता है?
ईनपोकलूम

3

इस विषय पर अधिक http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Core-C-/Stephan-T-Lavavej-Core-C-1-of-n

यह एक लूओंग नेमस्पेस नाम के लिए एक उपनाम चुनने के बारे में है, जैसे:

namespace SHORT = NamespaceFirst::NameSpaceNested::Meow

फिर बाद में, आप टाइप कर सकते हैं

typedef SHORT::mytype

के बजाय

typedef NamespaceFirst::NameSpaceNested::Meow::mytype

यह सिंटैक्स केवल नामस्थानों के लिए काम करता है, इसमें वर्गों, प्रकारों को शामिल नहीं किया जा सकता है namespace NAME =


3

यह भी ध्यान दें कि नाम स्थान के उपनाम और निर्देशों का उपयोग संकलन समय पर हल किया जाता है, समय नहीं। (विशेष रूप से, वे दोनों उपकरण हैं जो संकलक को यह बताने के लिए उपयोग करते हैं कि नामों को हल करते समय कैसे देखा जाए, अगर यह वर्तमान क्षेत्र या इसके किसी भी मूल स्कोप में कोई विशेष प्रतीक नहीं पा सकता है।) उदाहरण के लिए, इनमें से कुछ भी नहीं। संकलन:

namespace A {
    int foo;
    namespace AA {
        int bar;
    } // namespace AA
    namespace AB {
        int bar;
    } // namespace AB
} // namespace A
namespace B {
    int foo;
    namespace BA {
        int bar;
    } // namespace BA
    namespace BB {
        int bar;
    } // namespace BB
} // namespace B

bool nsChooser1, nsChooser2;
// ...

// This doesn't work.
namespace C = (nsChooser1 ? A : B);
C::foo = 3;

// Neither does this.
// (Nor would it be advisable even if it does work, as compound if-else blocks without braces are easy to inadvertently break.)
if (nsChooser1)
    if (nsChooser2)
        using namespace A::AA;
    else
        using namespace A::AB;
else
    if (nsChooser2)
        using namespace B::BA;
    else
        using namespace B::BB;

अब, एक जिज्ञासु मन ने देखा होगा कि constexprचर भी संकलन समय पर उपयोग किए जाते हैं, और आश्चर्य है कि क्या वे एक उपनाम या एक निर्देश के साथ संयोजन में उपयोग किए जा सकते हैं। मेरे ज्ञान के लिए, वे नहीं कर सकते, हालांकि मैं इस बारे में गलत हो सकता है। यदि आपको अलग-अलग नामस्थानों में पहचान-नाम वाले चर के साथ काम करने की आवश्यकता है, और गतिशील रूप से उनके बीच चयन करना है, तो आपको संदर्भ या पॉइंटर्स का उपयोग करना होगा।

// Using the above namespaces...
int& foo = (nsChooser1 ? A::foo : B::foo);

int* bar;
if (nsChooser1) {
    if (nsChooser2) {
        bar = &A::AA::bar;
    } else {
        bar = &A::AB::bar;
    }
} else {
    if (nsChooser2) {
        bar = &B::BA::bar;
    } else {
        bar = &B::BB::bar;
    }
}

उपरोक्त की उपयोगिता सीमित हो सकती है, लेकिन इसे उद्देश्य की पूर्ति करनी चाहिए।

(उपरोक्त किसी भी टाइप्स के लिए मेरी क्षमा याचना छूट गई है।)


0

नाम विवाद को रोकने के लिए नेमस्पेस का उपयोग किया जाता है।

उदाहरण के लिए:

namespace foo {
    class bar {
        //define it
    };
}

namespace baz {
    class bar {
        // define it
    };
}

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

आपके द्वारा दिखाए जाने वाले "नेमस्पेस का उपयोग करना" इतना है कि आपको उस नामस्थान के भीतर कक्षाओं का उपयोग करने के लिए नेमस्पेस निर्दिष्ट करने की आवश्यकता नहीं है। यानी std :: string बन जाती है।

मेरा संसाधन: https://www.quora.com/What-is-namespace-in-C++-1

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.