2010-01-16 9 views
6

Possible Duplicates:
Why is ‘using namespace std;’ considered a bad practice in C++?
Using std Namespaceसी ++ नेमस्पेस - "उपयोग" या स्पष्ट रूप से कहा गया है?

क्या यह वरीयता का मामला है? या वहां

using namespace std; 
#include <string> 
myString string; 

या

#include <string> 
myString std::string; 

पसंद करते हैं के लिए एक वैध कारण मुझे लगता है कि या लगता है स्पष्ट रूप से नाम स्थान हर बार करते हुए कहा है, जबकि प्रकार के एक खींचें, नाम संघर्ष की किसी भी संभावना से बचा जाता है (संकलक होगा है अस्पष्टता की चेतावनी?)

प्रश्न: क्या कोई दृढ़ तर्क एक या दूसरे तरीके से है?

+2

http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-a-bad-practice-in-c कई अन्य लोगों के बीच डुप्पी। –

+0

आप सही हैं! जब मैंने खोज की तो मुझे उनको क्यों नहीं मिला? क्षमा करें – Mawg

उत्तर

4

यह एक ही विषय पर मैंने लिखा एक और उत्तर का एक संशोधित संस्करण है। अब संस्करण 3 तक।

प्रमुख समस्या नाम विवाद है, यदि आपके पास आपके कोड में count नामक एक चर है और आप using namespace std; हैं तो यह आपके अर्थ के अनुसार अस्पष्ट होगा। यह सिर्फ count नहीं है। reverse और equal भी शामिल किए जाएंगे, जो सभी आम पहचानकर्ता हैं। उदाहरण के लिए, इस एक संकलन त्रुटि में परिणाम होगा:

#include <algorithm> 
using namespace std; 

int count; 
int main(int argc, char* argv[]){ 
    count = 1; 
} 

संकलक करने के लिए सभी समस्याओं की अनदेखी, यह भी अपने कोड को पढ़ने के लिए आ रहा है किसी के लिए भी एक समस्या है। उन अतिरिक्त 5 अक्षर सुनिश्चित करना है कि अगले व्यक्ति हर दूसरे लाइन फ़ाइल के शीर्ष जाँच करने के लिए यदि आप std::string या mylib::string मतलब है जब आप string


बारे में यह भी देखने के लिए बिना अपने कोड knowns आप वास्तव में क्या मतलब है को बनाए रखने यह ध्यान देने योग्य है कि आपको कभी भी हेडर फ़ाइल में using namspace xyz नहीं डालना चाहिए, क्योंकि यह उस हेडर फ़ाइल को शामिल करने वाली सभी फ़ाइलों को प्रचारित कर सकता है, भले ही वे उस नामस्थान का उपयोग नहीं करना चाहते हैं। यहां एक और समस्या यह है कि यह भी स्पष्ट नहीं है कि std नेमस्पेस आयात किया गया है, इसलिए रखरखाव (या आप 3 महीने के समय में) एक वैरिएबल को एक ही नाम के साथ जोड़ते हैं जैसे कुछ अस्पष्ट std फ़ंक्शन जिसे एक ही संकलन इकाई में शामिल किया गया था और फिर संकलन त्रुटि के कारण को खोजने का प्रयास करने में एक घंटे खर्च करता है।

मामलों के बहुमत में यह बहुत

using std::swap 

उपयोग करने के लिए के रूप में अगर वहाँ स्वैप की एक विशेष संस्करण है, संकलक का उपयोग करेगा फायदेमंद है, (प्रभावी सी ++ से) अन्यथा इसे वापस std::swap पर गिर जाएगी । यदि आप std::swap पर कॉल करते हैं, तो आप हमेशा मूल संस्करण का उपयोग करते हैं, जो विशेष संस्करण को कॉल नहीं करेगा (भले ही यह मौजूद है)।

pimpl idiom का उपयोग कर उदाहरण कोड के लिए लें। जहां डिफ़ॉल्ट प्रतिलिपि वास्तविक कार्यान्वयन में सभी डेटा की प्रतिलिपि बना सकती है, जहां सभी को करने की आवश्यकता है, पॉइंटर्स को स्वैप करना है। एक विशेष स्वैप का उपयोग करने से बड़ी मात्रा में निष्पादन समय बचा सकता है, और अच्छी तरह से डिज़ाइन किए गए पुस्तकालयों को इसका विशेषज्ञ होना चाहिए।


सारांश में,

  • हमेशा using std::swap प्रचार की वजह से हर हालत में एक शीर्षक में std::swap() से अधिक

  • बचें using namespace std पसंद करते हैं, कार्यान्वयन फ़ाइलों में इसका उपयोग करने से बचने की कोशिश।

  • प्रत्येक फ़ाइल के शीर्ष पर हजारों using std::foo होने का कोई तरीका नहीं है। आमतौर पर कक्षाओं का उपयोग करने के लिए इसका उपयोग करें।

बाकी सब कुछ राय है।

+0

लॉल ... (लगभग) इस प्रश्न के हर डुप्लिकेट का जवाब आपके द्वारा है ...: डी – missingfaktor

2

उपयोग सीपीपी फ़ाइलों में ठीक है। आप हेडर में दूसरा वाक्यविन्यास पसंद करेंगे ताकि आप उन्हें अपने पूरे प्रोजेक्ट में प्रचारित न करें।

3

व्यक्तिगत रूप से मैं using निर्देश using निर्देश के बजाय घोषणा करना पसंद करता हूं।

उदाहरण के लिए:

#include<string> 
using std::string; 

string x="abc"; 

using निर्देश का उपयोग करते हुए बाद में नाम टक्कर समस्याओं का कारण हो सकता है दायरे में पूरे नाम स्थान लाता है।

अधिक जानकारी के लिए this (दृढ़ता से अनुशंसित) पढ़ें।

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