हेडर और सोर्स (cpp) में C ++ नेमस्पेस बनाना


88

क्या हैडर और सीपीपी फाइल कंटेंट को किसी नेमस्पेस में लपेटने या सिर्फ हेडर कंटेंट को रैप करने और फिर सीपीपी फाइल में नेमस्पेस का उपयोग करने में कोई अंतर है ?

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

उदाहरण:

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

यदि कोई अंतर नहीं है तो पसंदीदा फॉर्म क्या है और क्यों?

जवाबों:


37

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

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


55

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

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


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

8

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

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


मैं इसे भटका नहीं कहूंगा, क्योंकि यह }बहुत ही अंत में समापन से मेल खाता है । हालाँकि, मैं उस जोड़े को अतिरेक
कहूंगा

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

1

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

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


1
मुझे नहीं लगता कि यह संकलित है, लेकिन इसलिए नहीं कि इसमें कोई अंतर है, बल्कि इसलिए कि एक भटका हुआ है {;-)
माइकल क्रेलिन - हैकर

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

1

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


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

1

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


0

मुझे लगता है कि यहां सही बात यह है कि स्कूपिंग के लिए नेमस्पेस का उपयोग करना है।

namespace catagory
{
    enum status
    {
      none,
      active,
      paused
    }
};

void func()
{
    catagory::status status;
    status = category::active;
}

0

यदि आप एक से दूसरे में चर का उपयोग करने का प्रयास कर रहे हैं, तो मैं उन्हें बाहरी बनाने की सलाह दूंगा, फिर उन्हें स्रोत फ़ाइल में आरंभ कर रहा हूं जैसे:

// [.hh]
namespace example
{
   extern int a, b, c;
}
// [.cc]
// Include your header, then init the vars:
namespace example
{
   int a, b, c;
}
// Then in the function below, you can init them as what you want: 
void reference
{
    example::a = 0;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.