2010-08-02 27 views
6

मैंने देखा है कि सी ++ नामस्थानों में बहुत ही कम उपयोग किया जाता है जबकि नेट में यह बहुत आम है। इसके लिए कोई विशेष कारण है।नामस्थान और सी ++

मैं यह भी जानना चाहता हूं कि अन्य लोगों ने आमतौर पर सी ++ में नामस्थानों का उपयोग किया है या नहीं।

संपादित करें: वास्तव में मैं कस्टम अनुप्रयोगों का जिक्र कर रहा हूं और मानक पुस्तकालयों जैसे एसटीएल या किसी अन्य चीज का जिक्र नहीं कर रहा हूं।

+6

मुझे आश्चर्य है कि आप कौन सा कोड देख रहे हैं। "मुख्य कोड" को छोड़कर, मैं जो भी करता हूं, वह नामस्थान में है। – GManNickG

+0

@GMan: ठीक है, एक उदाहरण के रूप में, [स्कॉट मेयर्स को उनकी परवाह नहीं है] (http://groups.google.com/group/comp.lang.c++.moderated/msg/f7e901ce6e8a86c0) (या, पर कम से कम वह उस वक्त नहीं था जब उसने लिखा था, नौ साल पहले)। –

+3

मेयर्स नामस्थान की अवधारणाओं के बारे में शिकायत नहीं कर रहा था, बस समझौता (कोएनिग लुकअप) के बारे में भाषा में उन्हें फिर से निकालने के लिए आवश्यक था। –

उत्तर

10

सी ++ में, नामांकन को प्रारंभिक कार्यान्वयन के कुछ समय बाद भाषा में जोड़ा गया था, इसलिए वहां बहुत से एप्लिकेशन कोड थे जिनका उपयोग नहीं किया गया था। इसलिए, उनके देरी के अतिरिक्त होने के कारण, सभी मानक पुस्तकालय को एक नामस्थान में रखा गया था। इसलिए एक साधारण using namespace std; के साथ यदि आप चाहें तो आप नामस्थानों को बहुत अधिक अनदेखा कर सकते हैं।

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

-1

Boost C++ libraries नामस्थानों का व्यापक रूप से उपयोग करें।

+0

नीचे वोट क्यों? –

+0

आपने इस प्रश्न का उत्तर नहीं दिया। – zgnilec

3

मैं देखा है कि सी ++ नामस्थान में बहुत मुश्किल से ही उपयोग किया जाता है

आप प्रासंगिक empirics साथ कि बैकअप लेने के लिए सक्षम हो सकते हैं? Boost, Qt, एसटीएल, ... सभी नामस्थान का उपयोग करें।

+1

कई, क्यूटी में कई नाम वैश्विक नामस्थान में हैं ... – jpalecek

+1

@Jpalecek: फिर भी बहुत कुछ नहीं हैं। मुद्दा यह है कि क्यूटी बड़े पैमाने पर नेमस्पेस का उपयोग करता है। –

+0

@ मार्टिन यॉर्क: मैंने अपने डेबियन सिस्टम पर 'एनएम-डीसी/यूएसआर/lib/libQtCore.so' किया था, और वैश्विक नामस्थान में नामों की तलाश नहीं की थी। कोई नहीं है, वही 'libQtGui.so' और 'libQtNetwork.so' के लिए लागू होता है। यह वह नहीं है जिसे मैं "व्यापक उपयोग" कहता हूं। वास्तव में, क्यूटी एपीआई में माध्यमिक क्षेत्रों में बहुत कम नामस्थान होते हैं, साथ ही कुछ नामस्थान कार्यान्वयन विवरण के रूप में होते हैं। – jpalecek

0

5 अलग-अलग स्थानों पर काम करने से मैं कह सकता हूं कि 5 में से 2 नामित नामस्थान शामिल होने से पहले।

मुझे लगता है कि सी ++ में नामस्थान उतना उपयोग नहीं किया जाता है (जैसा कि उन्हें चाहिए?) वाक्यविन्यास होने के कारण है।

अर्थात्:

namespace xml::xmpp::core { }

लेकिन बजाय यह लिखने के लिए है:: मैं इस लिखना चाहते

namespace xml { namespace xmpp { namespace core { } } }

और घोषित अग्रेषित करने के लिए, मैं लिखने के लिए करना चाहते हैं:

class xml::parser;

लेकिन

namespace xml { class parser; }

लिखने के लिए है लेकिन मैं लिख सकते हैं:

using namespace xml::xmpp::core;

एक अलग टिप्पणी पर, किसी को भी मेरी बता सकते हैं क्यों कक्षाएं एक सेमी-कोलन द्वारा समाप्त किया जा करने के लिए है लेकिन कुछ और (कार्य, नामस्थान) नहीं है?

+1

आखिरी बार अपने स्वयं के प्रश्न का हकदार है, लेकिन ऐसा इसलिए है क्योंकि आप एक चर घोषित कर सकते हैं। कक्षा घोषणा के लिए दो वैकल्पिक भाग हैं, परिभाषा (यदि छोड़ी गई है, तो आपके पास आगे की घोषणा है), और चर की सूची। कुछ पुराने सी कोड पर एक नज़र डालें जो प्रत्येक स्ट्रक्चर को टाइप करने के लिए टाइप करता है। –

+0

ठीक है। हालांकि यह मुझे बग करता है। –

+0

नेमस्पेस xml {क्लास पार्सर; } कक्षा xml {वर्ग पार्सर {...}; }; कक्षा xml :: पार्सर; // कौन सा xml :: पार्सर इस पूर्ववर्ती है? –

7

सी ++ में नेमस्पेस नेट, एक्शनस्क्रिप्ट और जावा (जो एक ही अवधारणा को साझा करता है) के समान नहीं हैं। वे बिल्कुल वही अवधारणा नहीं हैं।

सी ++ में, नामस्थान मुख्य रूप से नामित संदर्भ, नामस्थान में कई प्रकार और कार्यों के समावेशन की अनुमति देने के लिए हैं। यह केवल नामकरण और नामों तक पहुंचने के बारे में है।

नेट, एक्शनस्क्रिप्ट और जावा में, नामस्थान नामों की तुलना में मॉड्यूल के बारे में अधिक हैं। वे डेवलपर को अपने कोड को अलग-अलग नामस्थानों में व्यवस्थित करने के लिए मजबूर करते हैं जो प्रत्येक एक उद्देश्य, संदर्भ के बारे में हैं। चूंकि ये भाषाएं गतिशील हैं (सी ++ जैसी स्थिर की बजाय), नामस्थान देर से बाध्यकारी प्रकार को कोड करने की अनुमति देते हैं, जिससे संकलन तेजी से हो जाता है क्योंकि आपके पास केवल उस फ़ाइल के कैननिकल नाम (नामस्थान + नाम) होना चाहिए जिसे आप फ़ाइल में उपयोग करना चाहते हैं ।

सी ++ में कोई मॉड्यूल अवधारणा नहीं है, केवल संकलन इकाइयां जो एक-दूसरे के बारे में बिल्कुल नहीं जानती हैं।

अब उनके उपयोग के बारे में, मॉड्यूल (निष्पादन योग्य या डीएल/एस), कुछ कार्यान्वयन कोड या कोड के किसी भी उपयोगी उप भाग को समाहित करने के लिए सी ++ में नामस्थान का उपयोग करना अक्सर अच्छा अभ्यास होता है। ऐसा कहा जाता है कि ज्यादातर समय नामस्थानों का गहरा पदानुक्रम नहीं होना बेहतर होता है। ऐतिहासिक कारणों से, बहुत से सी ++ डेवलपर्स को बहुत लंबे समय तक यह नहीं पता था कि सी ++ में नेमस्पेस नामक सुविधा थी। अब हम "आधुनिक सी ++" को क्या कहते हैं, यह सुझाव देते हैं कि आप इसके बारे में जानते हैं, लेकिन आज भी बहुत पुराने सी ++ कोड का उपयोग किया जाता है और हो सकता है कि आप नामस्थानों के बारे में बात करते समय यही देख रहे हों।

सी ++ में नामस्थान अन्य भाषाओं की तुलना में एक अलग सुविधा होने के कारण यह कोड में कम या ज्यादा स्पष्ट लिख रहा है। असल में, यह इतना अलग है कि आप इसे वैसे ही प्रबंधित नहीं करेंगे, जब आप कहने से आ रहे हैं तो कोड को समझना वाकई मुश्किल है। नेट। इसलिए आपको भाषाओं के बीच समान नामों को नाम नहीं लेना चाहिए, वे वास्तव में अलग-अलग अवधारणाएं हैं।

+2

"नेट, एक्शनस्क्रिप्ट और जावा में, नेमस्पेस नामों की तुलना में मॉड्यूल के बारे में अधिक हैं।" यह निश्चित रूप से .NET के संबंध में गलत है। नामस्थान के सदस्यों को कई असेंबली में परिभाषित किया जा सकता है, और एक असेंबली में कई नामस्थानों में परिभाषाएं हो सकती हैं। यह वास्तव में, सी ++ में नामस्थान कैसे काम करता है के समान ही है। जावा थोड़ा अलग है क्योंकि नेमस्पेस डिफ़ॉल्ट रूप से .class फ़ाइलों के फ़ाइल सिस्टम स्थानों को सूचित करते हैं (पल के लिए जार को अनदेखा करते हैं) लेकिन फिर भी, मॉड्यूल इकाई .class है, नामस्थान नहीं है और अलग-अलग "विक्रेता" कक्षाएं प्रदान कर सकते हैं नाम स्थान। –

+0

यहां "मॉड्यूल" सीधे असेंबली या .jar से संबंधित नहीं है बल्कि "सिस्टम" - एक वर्ग, कई वर्ग, एक जार इत्यादि से संबंधित नहीं है। उस ने कहा, परिशुद्धता के लिए धन्यवाद। – Klaim

2

सबसे आसान जवाब यह होगा कि जब आप विजुअल स्टूडियो (2003 और आगे) में कोई प्रोग्राम प्रारंभ करते हैं तो यह डिफ़ॉल्ट रूप से namespaces बनाता है। अन्य (पुराने) आईडीई नहीं, मुझे लगता है।

.NET ने इसे शुरुआत से प्रोत्साहित किया है। नेमस्पेस हमेशा सी ++ में मूल कार्यान्वयन का हिस्सा नहीं थे। यह नेट के साथ कर्षण प्राप्त किया है।

0

नामस्थान आपकी बड़ी परियोजनाओं में हैं!

इसे देखा या नहीं - इससे कोई फर्क नहीं पड़ता। उन्हें उपयोग करने की आदत को गले लगाओ।

0

जैसे ही समय बीतता है, मैं नामस्थानों के विचारशील उपयोग को अधिक से अधिक सी ++ कोड देखता हूं। हो सकता है कि आप सी-टू-क्लास प्रोग्रामिंग शैली के प्रभावशाली प्रभावों को देख रहे हों ...

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

0

एक कारण यह है कि कुछ लोकप्रिय कंपाइलर्स (विशेष रूप से जीसीसी ने) नामस्थानों के लिए बहुत देर से समर्थन जोड़ा, और अधिक पोर्टेबल होने के लिए नामस्थानों के बिना कई परियोजनाएं शुरू की गईं। बेशक, नामस्थानों का उपयोग न करने वाली एक नई परियोजना के लिए अजीब होगा।

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