2009-08-13 13 views
9

निम्नलिखित दो बयान पर विचार करें:क्या उपनाम के बराबर किसी अन्य नामस्थान के अंदर 'नेमस्पेस का उपयोग करना' है?

namespace foo = bar; 

और

namespace foo { 
    using namespace bar; 
} 

उन दो बयानों बराबर हैं, या वहाँ कुछ सूक्ष्म अंतर मैं के बारे में पता नहीं कर रहा हूँ कर रहे हैं?

(कृपया ध्यान दें कि यह कोडिंग शैली के बारे में कोई सवाल नहीं है - मुझे बस सी ++ पार्सिंग में दिलचस्पी है)।

उत्तर

15
namespace foo=bar; 

यह किसी भी नाम लुकअप नियमों को प्रभावित नहीं करता है। एकमात्र प्रभाव 'फू' को 'बार' के लिए उपनाम बनाना है। उदाहरण के लिए:

namespace bar 
{ 
    void b(); 
} 

void f() { 
    bar::b(); // Call 'b' in bar 
    foo::b(); // 'foo' is an alias to 'bar' so calls same function 
} 

निम्नलिखित परिवर्तन देखने नियम

namespace NS 
{ 
    namespace bar 
    { 
    } 

    namespace foo { 
    using namespace bar; 

    void f() { 
     ++i; 
    } 
    } 
} 

जब देखने के लिए जगह लेता है करता है 'i', 'foo' पहली खोज की जाएगी, उसके बाद 'एन एस' फिर 'बार'।

+0

बहुत देर से टिप्पणी के लिए खेद है, लेकिन मुझे लगा कि दूसरों को खोजा जा सकता है। उपयोग नामस्थान बार कथन केवल उन चीजों को उस समय परिभाषित करता है जो उस समय foo नामस्थान में परिभाषित किया गया है। संक्षेप में, यह खराब ऑर्डर निर्भरता बना सकता है। Sutter/Alexandrescu के C++ कोडिंग मानकों में आइटम # 59 देखें –

+0

@RobL: _declaration_ का उपयोग केवल उस समय घोषित नामों में लाता है। उपर्युक्त _directive_ का उपयोग कर रहा है। पूर्व नामस्थान से नामों के वर्तमान दायरे में पुनर्विक्रय की तरह है। उत्तरार्द्ध कहने के लिए एक नियम की तरह है, अगर आपको यह यहां नहीं मिला है तो इस अन्य नामस्थान की जांच करें। –

2

जैसा कि आप किसी अन्य नाम में नामस्थान आयात कर रहे हैं, तो हाँ, यह उस सम्मान में बराबर होना चाहिए। हालांकि, दूसरा भी अन्य कोड को अंदर रखने की इजाजत देता है, ताकि आप नामस्थान फू के हिस्से को भी रख सकें। पूर्व केवल उपनाम बनाता है।

+0

और यदि नाम नामस्थान 'foo' में जोड़े गए हैं तो अलग-अलग लुकअप नियमों के परिणामस्वरूप दो उदाहरणों के बीच अलग-अलग नाम मिल सकते हैं। –

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