C ++ में "नाम स्थान का उपनाम" क्या है? इसका उपयोग कैसे किया जा सकता है?
C ++ में "नाम स्थान का उपनाम" क्या है? इसका उपयोग कैसे किया जा सकता है?
जवाबों:
एक नामस्थान उपनाम किसी भिन्न, छोटे नाम द्वारा लंबे नामस्थान नाम का संदर्भ देने का एक सुविधाजनक तरीका है।
एक उदाहरण के रूप में, मान लें कि आप बिना किसी using namespace
निर्देश के बूस्ट के यूबीएलएएस से संख्यात्मक वैक्टर का उपयोग करना चाहते थे । हर बार पूरा नामपट्ट लगाना बोझिल है:
boost::numeric::ublas::vector<double> v;
इसके बजाय, आप के लिए एक उपनाम परिभाषित कर सकते हैं boost::numeric::ublas
- कहते हैं कि हम इसे केवल संक्षिप्त करना चाहते हैं ublas
:
namespace ublas = boost::numeric::ublas;
ublas::vector<double> v;
काफी बस, # काम नहीं करेगा।
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 पहले से ही एक वर्ग का नाम है।
इस विषय पर अधिक 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 =
यह भी ध्यान दें कि नाम स्थान के उपनाम और निर्देशों का उपयोग संकलन समय पर हल किया जाता है, समय नहीं। (विशेष रूप से, वे दोनों उपकरण हैं जो संकलक को यह बताने के लिए उपयोग करते हैं कि नामों को हल करते समय कैसे देखा जाए, अगर यह वर्तमान क्षेत्र या इसके किसी भी मूल स्कोप में कोई विशेष प्रतीक नहीं पा सकता है।) उदाहरण के लिए, इनमें से कुछ भी नहीं। संकलन:
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;
}
}
उपरोक्त की उपयोगिता सीमित हो सकती है, लेकिन इसे उद्देश्य की पूर्ति करनी चाहिए।
(उपरोक्त किसी भी टाइप्स के लिए मेरी क्षमा याचना छूट गई है।)
नाम विवाद को रोकने के लिए नेमस्पेस का उपयोग किया जाता है।
उदाहरण के लिए:
namespace foo {
class bar {
//define it
};
}
namespace baz {
class bar {
// define it
};
}
अब आपके पास दो वर्गों का नाम बार है, जो नाम स्थान के लिए पूरी तरह से अलग और अलग धन्यवाद हैं।
आपके द्वारा दिखाए जाने वाले "नेमस्पेस का उपयोग करना" इतना है कि आपको उस नामस्थान के भीतर कक्षाओं का उपयोग करने के लिए नेमस्पेस निर्दिष्ट करने की आवश्यकता नहीं है। यानी std :: string बन जाती है।
मेरा संसाधन: https://www.quora.com/What-is-namespace-in-C++-1