2011-06-24 9 views
13

मुझे आश्चर्य है कि using namespace std; कहां रखना है। मैंने में using namespace std; के साथ एक कोड देखा लेकिन मैं #include <iostream> के बाद इसे डाल रहा था। मुझे इसे कहां रखना चाहिए और क्या इससे कोई फर्क पड़ता है जहां मैंने इसे रखा?जहां नामस्थान std का उपयोग करना है;

+8

यह कहीं भी रख मत करो! –

+3

@ मार्टिन: मेह, यह अत्यधिक प्रतिबंधक है। वहां बहुत छोटी परियोजनाएं/फाइलें मौजूद हैं जहां 'नेमस्पेस std का उपयोग करके' जोड़ना समस्याएं पैदा नहीं करेगा। –

+2

बिलकुल कभी नहीं, कभी इसे हेडर फ़ाइल में डालें। सबसे अच्छा कभी भी 'नेमस्पेस std' का उपयोग कभी भी नहीं करना है। मैं मार्टिन के साथ सहमत हूं। –

उत्तर

11

यह विशाल अंतर बनाता है जहां आप इसे डालते हैं।

यदि आप इसे किसी फ़ंक्शन के अंदर रखते हैं, तो यह केवल उस फ़ंक्शन में लागू होता है।

यदि आप इसे वैश्विक दायरे में एक फ़ंक्शन के बाहर रखते हैं तो यह उस बिंदु के बाद सब कुछ पर लागू होता है।

यदि आप इसे हेडर फ़ाइल में वैश्विक दायरे में किसी फ़ंक्शन के बाहर रखते हैं तो यह उस फ़ाइल पर भी लागू होगा जिसमें हेडर शामिल है।

आम तौर पर, हेडर में वैश्विक दायरे में इसका उपयोग करने के लिए बहुत बुरा अभ्यास है, और Unity builds में वैश्विक दायरे में इसका उपयोग करने के लिए अर्द्ध बुरी आदत है, हेडर और स्रोत फ़ाइलों के बीच भेद धुंधला हुआ है।

आप इसे केवल उन कार्यों में उपयोग करने के लिए सबसे अच्छा होगा, जिन्हें आप चाहते हैं, या यहां तक ​​कि इसका उपयोग न करें और std:: के साथ मानक लाइब्रेरी फ़ंक्शंस/कक्षाओं को उपसर्ग करें।

6

सामान्य रूप से (और बड़ी परियोजनाओं में निश्चित रूप से), यह सर्वोत्तम not to use it at all है।

13

इसे किसी फ़ंक्शन के अंदर जोड़ना केवल उस फ़ंक्शन में उपयोग कथन के दायरे को प्रतिबंधित करता है। अपने हेडर फ़ाइल के उपयोगकर्ताओं के लिए संघर्ष से बचने के लिए आपको शीर्षलेख के अंदर using कथन कभी नहीं रखना चाहिए।

फ़ाइल के दायरे में इसे ऊपर से ऊपर रखना ठीक है अगर आपको पता है कि कोई संघर्ष नहीं होगा, लेकिन इससे भी अन्य आयातित प्रकारों में समस्याएं हो सकती हैं और आमतौर पर मध्यम आकार की परियोजनाओं से बचा जा सकता है। मैं जितना संभव हो सके वैश्विक नामस्थान के प्रदूषण से बचने की कोशिश करता हूं, लेकिन यदि मैं एक-एक, छोटी कार्यान्वयन फ़ाइल लिख रहा हूं, तो मैं सुविधा के लिए शीर्ष पर using namespace std; जोड़ूंगा।

आपके मामले में, यह सोचते हैं आप केवल std::cout और std::cin (सिर्फ एक उदाहरण) का उपयोग करना चाहते हैं, तो आप ऐसा कर सकते हैं: पूरी तरह से प्रकार योग्यता के बिना

using std::cout; 
using std::cin; 

अब आप cin >> whatever लिख सकते हैं और cout << whatever/प्रत्येक वस्तु समय और आप ग्लोबल नेमस्पेस को प्रदूषित करने से भी बचते हैं।

6

using निर्देश स्कॉप्ड किया गया है, इसलिए यह केवल उस दायरे के भीतर प्रभावी होगा जिसमें यह प्रतीत होता है। जहां भी यह आपकी स्थिति के लिए सबसे उपयुक्त है इसका उपयोग करें।

0

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

2

यदि आपको हर जगह std :: टाइप करना पसंद नहीं है (मैं करता हूं, मेरे कोड में पर्याप्त डबल-कॉलन नहीं मिल सकता है!), सर्वोत्तम अभ्यास उन नामों को चुनिंदा रूप से आयात करना है जिन्हें आप चाहते हैं:

void some_function() 
{ 
    using std::vector; 

    vector<int> x; 
    ... 
} 

वैश्विक दायरे में use चयनित नाम भी ठीक है।

इस तरह आप मानक पुस्तकालय में सभी नामों को वैश्विक नामस्थान में नहीं खींचते हैं।

0

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

वैश्विक दायरे में, यह हर जगह लागू होता है। एक स्थानीय दायरे में (यानी, केवल मुख्य() में, यह केवल मुख्य में लागू होगा।

यहां कुछ विकल्प अच्छा विकल्प हैं

  • रखें std :: सब कुछ यानी पहले, std::cout << "Hello, World!" << std::endl;
  • केवल विशिष्ट बात आप एक समारोह के अंदर चाहते हैं का उपयोग करें।

एक स्थानीय समारोह में केवल बातें आप चाहते हैं का उपयोग करने का एक उदाहरण:

int main() 
{ 
    using std::cout; 
    using std::endl; 
    cout << "Hello, World!" << endl; 
    return 0; 
} // Obviously you need #include <iostream> at the top..