2009-07-31 11 views

उत्तर

149

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

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

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

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

namespace ublas = boost::numeric::ublas; 


ublas::vector<double> v; 
+7

संभावित रूप से डाउनवॉट्स को समझाने के लिए, एसओ एक अच्छी सी ++ पाठ्यपुस्तक के लिए प्रतिस्थापन नहीं होगा और कभी भी प्रतिस्थापन नहीं होगा। आपके द्वारा उठाए गए प्रश्न का उत्तर ऐसी किसी भी पुस्तक द्वारा दिया जाएगा। और आपके स्वयं के प्रश्नों का उत्तर देने के लिए "सुविधा" का उपयोग ऐसी पुस्तकों के पैराफ्रेश प्रदान करने के लिए नहीं किया जाना चाहिए। –

+16

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

+1

जलन से बचने के लिए निश्चित रूप से अपने प्रश्न का उत्तर देने के लिए एक शिष्टाचार है; इस मामले में, यह बहुत स्पष्ट है कि यह कभी ** ** असली सवाल नहीं था। उदाहरण के लिए, http://stackoverflow.com/questions/494927/stack-overflow-etiquette-for-answering-your-own-question –

6

, #define काम नहीं करेगा

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; } }; } 

अंतिम पंक्ति पर, "हम्म: ओप्स" एक संकलित त्रुटि है। प्री-प्रोसेसर इसे नोप :: ओप्स में बदल देता है, लेकिन नोप पहले से ही एक क्लास नाम है। इस विषय पर

+0

एक ही समय में इतना आसान अभी तक बोझिल ...;) – Hermes

+2

क्या # परिभाषित है? शायद आपका उत्तर प्रश्न के पिछले संस्करण को संदर्भित करता है? – einpoklum

1

अधिक http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Core-C-/Stephan-T-Lavavej-Core-C-1-of-n

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

namespace SHORT = NamespaceFirst::NameSpaceNested::Meow

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

typedef SHORT::mytype

के बजाय

typedef NamespaceFirst::NameSpaceNested::Meow::mytype

इस वाक्य रचना केवल नामस्थान के लिए काम करता है, कक्षाएं शामिल नहीं कर सकते, namespace NAME =

1

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

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; 
    } 
} 

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

(उपर्युक्त में किसी भी टाइपो के लिए मेरी माफी माँग सकती है।)

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