2011-11-21 13 views
59

क्या कोई हेडर और सीपीपी फ़ाइल सामग्री को नामस्थान में लपेटने या हेडर सामग्री को लपेटने और फिर को cp फ़ाइल में नेमस्पेस का उपयोग करके कोई अंतर है?शीर्षलेख और स्रोत (सीपीपी) में एक सी ++ नेमस्पेस बनाना

अंतर से मेरा मतलब है कि किसी भी प्रकार का प्रदर्शन जुर्माना या थोड़ा अलग अर्थशास्त्र जो समस्याएं पैदा कर सकता है या मुझे कुछ भी पता होना चाहिए।

उदाहरण:

// header 
namespace X 
{ 
    class Foo 
    { 
    public: 
    void TheFunc(); 
    }; 
} 

// cpp 
namespace X 
{ 
    void Foo::TheFunc() 
    { 
    return; 
    } 
} 

वी.एस.

// header 
namespace X 
{ 
    class Foo 
    { 
    public: 
    void TheFunc(); 
    }; 
} 

// cpp 
using namespace X; 
{ 
    void Foo::TheFunc() 
    { 
    return; 
    } 
} 

अगर कोई अंतर वरीयता स्वरूप और क्यों क्या कर रहा है?

उत्तर

28

नेमस्पेस फ़ंक्शन हस्ताक्षर को उलझाने का एक तरीका है ताकि वे संघर्ष न करें। कुछ पहले तरीके पसंद करते हैं और दूसरे दूसरे संस्करण को पसंद करते हैं। दोनों संस्करणों का संकलन समय प्रदर्शन पर कोई प्रभाव नहीं पड़ता है। ध्यान दें कि नामस्थान केवल एक संकलित समय इकाई हैं।

नामस्थान का उपयोग करने वाली एकमात्र समस्या तब होती है जब हमारे पास समान नेस्टेड नेमस्पेस नाम होते हैं (i.e) X::X::Foo। ऐसा करने से कीवर्ड का उपयोग किए बिना या बिना भ्रम पैदा होता है।

34

"नेमस्पेस एक्स" में "नेमस्पेस एक्स" का उपयोग करने के लिए पहले व्यक्ति में कोई भी नई घोषणा नाम स्थान के नीचे होगी जबकि दूसरे में यह नहीं होगा।

उदाहरण में आपके पास कोई नई घोषणा नहीं है - इसलिए कोई फर्क नहीं पड़ता इसलिए कोई पसंदीदा तरीका नहीं है।

+0

यह परियोजना और शैली पर निर्भर करता है। मॉड्यूल में फ़ाइलों के लोड के लिए प्रायः एक मुख्य नामस्थान होता है, और दूसरी शैली समझ में आता है। –

1

यदि दूसरा भी संकलित करता है, तो कोई अंतर नहीं होना चाहिए। नामस्थान संकलित समय में संसाधित होते हैं और रनटाइम क्रियाओं को प्रभावित नहीं करना चाहिए।

लेकिन डिजाइन के मुद्दों के लिए, दूसरा भयानक है। भले ही यह संकलित (सुनिश्चित नहीं), यह बिल्कुल समझ में नहीं आता है।

+1

मुझे नहीं लगता कि यह संकलित है, लेकिन ऐसा नहीं है क्योंकि इसमें कोई फर्क पड़ता है, लेकिन क्योंकि एक भयानक '{' ;-) –

+0

अंतर है Foo :: TheFunc() को वैश्विक नामस्थान में घोषित किया गया है, जबकि इसे नामस्थान में परिभाषित किया गया है एक्स –

1

Foo :: TheFunc() VS-case के सही नामस्थान में नहीं है। सही नामस्थान (एक्स) में फ़ंक्शन को लागू करने के लिए 'शून्य एक्स :: Foo :: TheFunc() {}' का उपयोग करें।

+0

प्रश्न थोड़ा पुराना है, लेकिन क्या आप जानते हैं कि इसका क्या परिणाम है? अर्थात।क्या आप किसी भी समस्या में भाग लेंगे जिस तरह से उनके वीएस मामले ने नामस्थान में कार्यों की घोषणा की है, लेकिन उन्हें इसके बाहर परिभाषित करता है? –

5

कोई प्रदर्शन दंड नहीं है, क्योंकि परिणामस्वरूप वही होगा, लेकिन Foo को नामस्थान में डालने से अलग-अलग नामस्थानों में Foo एस होने पर अस्पष्टता लागू होती है। आप वास्तव में अपना कोड फ्यूबर प्राप्त कर सकते हैं। मैं इस उद्देश्य के लिए using का उपयोग करने से बचने की सलाह दूंगा।

और तुम एक आवारा { के बाद using namespace ;-)

+0

मैं इसे भटक नहीं कहूंगा, क्योंकि यह अंत में बंद होने वाले '}' से मेल खाता है। हालांकि, मैं उस जोड़ी को ब्रेसिज़ अनावश्यक कहूंगा;) – blubberdiblub

+0

@blubberdiblub, सवाल संपादित किया गया था, अगर आपने मूल संस्करण की जांच की है, तो आप * इसे * भटकेंगे ;-) –

0

मामले में आप लपेट केवल ज सामग्री आप नाम स्थान का उपयोग कर लिखने के लिए है ... cpp फ़ाइल में है, तो है अन्यथा आप हर बार वैध पर काम कर नाम स्थान। आम तौर पर आप दोनों .cpp और .h फ़ाइलों को लपेटते हैं अन्यथा आपको किसी अन्य नामस्थान से ऑब्जेक्ट्स का उपयोग करने का जोखिम होता है जो कई समस्याएं उत्पन्न कर सकता है।

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