2008-10-18 14 views
16

सी ++ नेमस्पेस का उपयोग करते समय, क्या आप उन्हें स्पष्ट रूप से नाम देना पसंद करते हैं, जैसे:क्या आप सी ++ में स्पष्ट नामस्थान या 'उपयोग' पसंद करते हैं?

std::cout << "Hello, world!\n"; 

या आप using namespace:

using namespace std; 
cout << "Hello, world!\n"; 

पसंद करते हैं और यदि आप बाद वाले को पसंद करते हैं, तो क्या आप अपने उपयोग की घोषणा करते हैं फ़ाइल या फ़ंक्शन स्कोप पर?

व्यक्तिगत रूप से मैं उन्हें स्पष्ट रूप से नाम देना पसंद करता हूं - यह अधिक टाइपिंग है लेकिन नामस्थानों के मिश्रण का उपयोग करते समय (उदा। std और boost) मुझे इसे और अधिक पठनीय लगता है।

उत्तर

17

मैं हमेशा using namespace का उपयोग std & बूस्ट के लिए करता हूं। बाकी सब कुछ मैं एक स्पष्ट नेमस्पेस का उपयोग करता हूं जब तक कि इसका इतना उपयोग नहीं किया जाता है कि यह कोड को अव्यवस्थित कर देगा।

हेडर में, मैं # अंतर्दृष्टि स्रोत के वैश्विक नामस्थान को प्रदूषित करने से बचने के लिए कभी भी using namespace का उपयोग नहीं करता हूं।

2

कुछ अस्पष्टता होने पर मैं केवल स्पष्ट नामस्थान का उपयोग करता हूं। यह अधिक पठनीय है, लेकिन अतिरिक्त टाइपिंग बहुत कठिन है, और आपको यह मानना ​​है कि अन्य डेवलपर्स के पास मानक पुस्तकालयों के साथ परिचितता का बेसलाइन स्तर है।

एक बार जब मैं केवल एक या दो बार इसका उपयोग कर रहा हूं, तो मैं एक बार या दो बार इसका उपयोग कर रहा हूं, जैसे कि त्वरित डीबग कथन में जोड़ना, या यदि मैं कुछ गैर-मानक लाइब्रेरी का उपयोग कर रहा हूं।

मैं आम तौर पर फ़ाइल स्कोप पर नेमस्पेस घोषित करता हूं, लेकिन यदि आप नामस्थानों को मिश्रित कर रहे हैं तो यह घोषणा को उस बिंदु के करीब रखने का अर्थ हो सकता है जहां इसे फ़ंक्शन स्कोप में उपयोग किया जाता है।

19

मैं हमेशा स्पष्ट लोगों का उपयोग करता हूं। लेखन std मुझे चोट नहीं पहुंचाता है और मैं स्पष्ट रूप से देखता हूं कि यह कहां से है। यह तब उपयोगी होता है जब आपके पास कुछ विरासत परियोजना होती है ताकि इसे बनाए रखने के लिए अपने "तार", "वैक्टर" आदि का ख्याल रखा जा सके। कोड जितना अधिक जानकारी लेता है उतना बेहतर।

+1

यह जब तक वहाँ एक टेम्पलेट विशेषज्ञता है कि आप पर बाहर याद आती है क्योंकि आप नाम स्थान स्पष्ट रूप से निर्दिष्ट है चोट नहीं करता है । मुझे स्वीकार करना होगा कि मैं खरगोश से बाहर करता हूं, लेकिन मेयर के "प्रभावी सी ++" पढ़ने के बाद से मैं कुछ और जानबूझकर सोचता हूं। – paxos1977

+0

प्रैक्टिस में मेरे लिए न्यूनतम और अधिकतम के लिए वास्तव में वास्तव में कोई मुद्दा रहा है, एमएस हेडर द्वारा आगे की कुचल भी # डिफाईन मिनट और अधिकतम – paulm

4

मेरा सामान्य नियम हमेशा हेडर में नेमस्पेस का स्पष्ट रूप से उपयोग करता है, और आमतौर पर कोड में उपयोग करने का उपयोग करता है। पूर्व के लिए कारण परिभाषा के हर हिस्से में इसे स्पष्ट रूप से स्पष्ट करना है, जिसका उपयोग किया जा रहा है, और बाद के कारण यह है कि यदि आवश्यक हो तो यह किसी अन्य नामस्थान से प्रतिस्थापन का उपयोग करना आसान बनाता है। यानी अगर हम std :: स्ट्रिंग के बजाय foo :: string का उपयोग करना प्रारंभ करना चाहते हैं तो हमें कोड में foo :: स्ट्रिंग के साथ std :: string के प्रत्येक इंस्टेंस को प्रतिस्थापित करने के बजाय हेडर और उपयोग कथन को अपडेट करने की आवश्यकता है।

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

19

अतिरिक्त टाइपिंग यहां समस्या नहीं है। स्पष्ट रूप से योग्य नामों के साथ समस्या दृश्य अव्यवस्था है। चलिए इसका सामना करते हैं, सी ++ सिंटैक्स बेकार है। :: एस के साथ उदारतापूर्वक कोड को छिड़कने और कोड को छिड़ककर इसे और भी खराब करने की आवश्यकता नहीं है।

मैं जेफ एटवुड के साथ हूं: The Best Code is No Code At All। ये बिल्कुल सही है।

नामस्थान आयात कोई खामी के साथ अव्यवस्था को कम करने का एक शानदार तरीका है: जब तक खोला नामस्थान के दायरे एक भी संकलन इकाई , नाम संघर्ष करने के लिए कम हो जाता है, वे दिखाई देनी चाहिए, आसानी से हल किया जा सकता।

क्यों स्पष्ट नाम (सामान्य रूप से) अधिक पठनीय होना चाहिए हमेशा मेरे लिए एक रहस्य रहा है। पाठकों को आमतौर पर सेमेंटिक्स को कम करने में सक्षम होने के लिए पर्याप्त कोड पता होना चाहिए। यदि वे नहीं हैं, तो कोड को वैसे भी ठीक करने की आवश्यकता है।


1) उपप्रमेय: हेडर में कोई using!

+0

कर रहा है, मुझे लगता है कि "विजुअल क्लटर" एक अजीब बिंदु है, अगर std :: इतना बुरा है तो सी ++ का उपयोग क्यों करें। – paulm

+0

@paulm मैं आपकी तर्क को समझ नहीं पा रहा हूं - बिल्कुल। यह मुखौटा लगता है: सिर्फ इसलिए कि सी ++ सामान्य रूप से वर्बोज़ का मतलब यह नहीं है कि हम अपने कोड को बेहतर नहीं बना सकते हैं। –

1

समारोह दायरे में using, या समारोह बहुत छोटे (अक्सर है), बस स्पष्ट नाम स्थान है अगर

4

using और using namespace बहुत बहुत कोड अधिक पठनीय रेंडर करने के लिए उपयोगी होते हैं - अव्यवस्था को हटा दें।

लेकिन किसी भी मामले में जहां यह पता लगाना मुश्किल हो जाता है कि कोई प्रतीक कहां से आता है, तो मैं इसका पूरा नामस्थान आयात करने से इंकार कर देता हूं।

मैं आयातित नामस्थान के दायरे limiit करने की कोशिश:

void bar() { 

    // do stuff without vector 

    { using std::vector; 
     // do stuff with vector 
    } 

    // do stuff without vector 
} 

के लिए "आम तौर पर जाना जाता है" पुस्तकालयों, std की तरह, मैं using namespace std का उपयोग कर की हिम्मत करेगा। इस कोड को पढ़ने वाले सभी को विश्वास करने का कारण है कि इन प्रतीकों को जानता है।

एक sidenote के रूप में, using कीवर्ड का भी यह संकेत करने के लिए उपयोग किया जाता है कि व्युत्पन्न वर्ग अपने सुपरक्लास के अधिभारित सदस्यों को भी निर्यात करता है।

class A { 
    void f(A ); 
    void f(bool); 
}; 

class B : public A { 
    using A::f; // without this, we get a compilation error in foo() 
    void f(bool); 
}; 

void foo() { 
    B b; 
    b.f(A()); // here's a compilation error when no `using` is used in B 
} 
2

मैं का नाम स्पष्ट है कि मैं .cpp फ़ाइल के शीर्ष पर जरूरत आयात करने के लिए करता है, इसलिए ...

std :: अदालत उपयोग करते हुए; std :: endl का उपयोग कर;

आदि ...

इस तरह मैं ऐसे नाम हैं जो मैं उपयोग पर नियंत्रण है और यह देखने के लिए वे कहाँ से आते हैं और कोड उपयोग के बिंदु पर भरा हुआ नहीं है आसान है।

दुर्लभ मामलों में जहां मैं विभिन्न नामस्थानों से दो नामों का उपयोग कर रहा हूं, मैं पूरी तरह से उपयोग के बिंदु पर उन्हें अर्हता प्राप्त करता हूं।

मैं हमेशा हेडर में पूरी तरह से योग्य नामों का उपयोग करें और शायद ही कभी कहीं भी 'का उपयोग कर नाम स्थान एक्स' का उपयोग करें ...

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