2010-02-07 29 views
16

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

using namespace std; 

सी ++ कार्यक्रमों में घोषित करने की आवश्यकता है?

उत्तर

42

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

हालांकि,

using namespace std; 

एक बुरा व्यवहार क्योंकि तुम व्यावहारिक रूप से पूरे मानक नाम स्थान आयात कर रहे हैं माना जाता है, इस प्रकार नाम संघर्ष के लिए संभावनाओं का एक बहुत खोलने। ऐसा लगता है कि

using std::string; 
+14

+1 इसका उल्लेख करने वाला एकमात्र व्यक्ति होने पर इसे फेंक दिया गया है। – GManNickG

23

कुछ भी नहीं करता है, यह एक आशुलिपि है एसटीडी के साथ कि नाम स्थान में सब कुछ :: लगाकर से बचने के लिए

+11

और इसे खराब अभ्यास के रूप में भी माना जाता है। – GManNickG

+2

यदि आप इसे वैश्विक नामस्थान करते हैं तो इसका खराब अभ्यास: डी –

+7

@GMan, @Hassan: कार्यान्वयन फ़ाइलों में इसका उपयोग करना और हेडर फ़ाइलों में खतरनाक है। हर कोई "खराब अभ्यास" क्यों कहता रहता है? मैं कोड पर काम नहीं करना चाहूंगा जहां मुझे जगह पर 'std ::' टाइप करना होगा, जैसे कि मैं नेमस्पेस का उपयोग करके 'नेमस्पेस' का उपयोग कर किसी भी नामस्थान को आयात नहीं करना चाहता हूं; ' – Potatoswatter

5

स्पष्ट std::member का उल्लेख करने की आवश्यकता के बिना std नाम स्थान में सदस्यों का उल्लेख करने की क्षमता। उदाहरण के लिए:

#include <iostream> 
using namespace std; 

... 
cout << "Hi" << endl; 

बनाम

सभी की
#include <iostream> 

... 
std::cout << "Hi" << std::endl; 
3

पहले, इस सी में की आवश्यकता नहीं है - सी नामस्थान जरूरत नहीं है। सी ++ में, std नामस्थान में कुछ भी जिसमें अधिकांश मानक लाइब्रेरी शामिल है। यदि आप ऐसा नहीं करते हैं तो आप ऐसा तरह स्पष्ट रूप से नाम स्थान के सदस्यों का उपयोग करने के लिए है:

std::cout << "I am accessing stdout" << std::endl; 
0

सभी सी ++ मानक पुस्तकालय में फ़ाइलों को एसटीडी नाम स्थान के भीतर अपनी संस्थाओं के सभी घोषित।
उदाहरण के लिए: cin,cout iostream में परिभाषित

विकल्प का उपयोग करें:

using std::cout; 
using std::endl; 
cout << "Hello" << endl;
std::cout << "Hello" << std::endl;

0

जब भी आप कुछ है कि एक नाम स्थान के अंदर घोषित किया जाता है का उपयोग कर रहे यह प्रयोग किया जाता है अपने कोड में केवल आपके द्वारा वास्तव में उपयोग कर रहे हैं आयात करने के लिए, बेहतर है। सी ++ मानक पुस्तकालय नामस्थान std के भीतर घोषित किया गया है।

std::cout << "cout is declared within the namespace std"; 

आप http://www.cplusplus.com/doc/tutorial/namespaces/ पर इसके बारे में अधिक पढ़ सकते हैं: इसलिए आप

using namespace std; 

करने के लिए जब तक आप तो जैसे जब एक और नाम स्थान के अंदर कार्यों बुला नाम स्थान निर्दिष्ट करने के लिए, चाहते हैं।

3

सबसे पहले, using निर्देश सी में कभी भी आवश्यक नहीं है क्योंकि सी नामस्थानों का समर्थन नहीं करता है।

आवश्यक वास्तव में कभी using निर्देश है सी में ++ के बाद से नाम स्थान में पाया वस्तुओं के किसी भी उन्हें std:: बजाय साथ लगाकर से सीधे पहुँचा जा सकता। तो, उदाहरण के लिए:

using namespace std; 
string myString; 

बराबर है करने के लिए:

std::string myString; 

या नहीं, आप इसका इस्तेमाल करते हैं प्राथमिकता का मामला है, लेकिन पूरे std नाम स्थान को उजागर करने में कुछ कीस्ट्रोक्स को बचाने के लिए आम तौर पर है खराब रूप माना जाता है।

using std::string; 
string myString; 

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

0

आपको नामस्थान std का उपयोग करने की घोषणा कभी नहीं करना है; यह है का उपयोग कर बुरा व्यवहार है और आप एसटीडी का उपयोग करना चाहिए :: यदि आप std :: हमेशा आप कुछ मामलों में कुछ इस तरह कर सकता है टाइप करने के लिए नहीं करना चाहती:

using std::cout; 

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

Rgds लेन

+2

हेडर फाइलों में वैश्विक नामस्थान में यह केवल खराब अभ्यास है। कार्यान्वयन फाइलों में यह अक्सर एक अच्छा विचार है। टाइपिंग सहेजना अप्रासंगिक है - आपके संपादक को आपके लिए टाइप करना चाहिए।यह अच्छा है क्योंकि यह हर जगह 'std ::' होने से कोड को और अधिक पठनीय बनाता है, और प्रत्येक फ़ाइल के शीर्ष पर 'std :: जिसका उपयोग करके' की तीसरी पंक्तियों की तुलना में अधिक रखरखाव करता है। – Porculus

5

आप निश्चित रूप से यह नहीं कहना चाहिए:

using namespace std; 
अपने सी ++ हेडर में

, क्योंकि वह नामस्थान का उपयोग कर (कि कर का गठन होगा "नाम स्थान प्रदूषण") के पूरे मुद्दे धड़कता है। इस विषय पर कुछ उपयोगी संसाधन निम्नलिखित हैं: Standard convention for using “std”

2 पर

1) stackoverflow धागा) हर्ब Sutter द्वारा एक लेख Migrating to Namespaces

3) FAQ 27.5 पर मार्शल क्लाइन से सी ++ Faq लाइट।

1

नामस्थान भ्रम से बचने और विरोधाभास से नामों से बचने के लिए कोड लपेटने का एक तरीका है। उदाहरण के लिए:

फ़ाइल common1.h:

namespace intutils 
{ 
    int addNumbers(int a, int b) 
    { 
     return a + b; 
    } 
} 

प्रयोग फ़ाइल:

#include "common1.h"  
int main() 
{ 
    int five = 0; 
    five = addNumbers(2, 3); // Will fail to compile since the function is in a different namespace. 
    five = intutils::addNumbers(2, 3); // Will compile since you have made explicit which namespace the function is contained within. 

    using namespace intutils; 
    five = addNumbers(2, 3); // Will compile because the previous line tells the compiler that if in doubt it should check the "intutils" namespace. 
} 

इसलिए, जब आप लिखना using namespace std सब आप कर रहे हैं संकलक कह रहा है कि अगर संदेह में यह देखना चाहिए std फ़ंक्शंस इत्यादि के लिए नामस्थान, जिसमें इसे परिभाषाएं नहीं मिल सकती हैं। इसका उपयोग आमतौर पर उदाहरण (और उत्पादन) कोड में किया जाता है क्योंकि यह सामान्य कार्यों को टाइप करता है, जैसे coutstd::cout के रूप में प्रत्येक को पूरी तरह अर्हता प्राप्त करने से तेज़ है।

7

तकनीकी तौर पर, आप (पूरे नामस्थान या अलग-अलग नामों के लिए) का उपयोग तर्क आश्रित लुक उपयोग करने के लिए सक्षम होने के लिए उपयोग करने की आवश्यकता हो सकती है।

swap() का उपयोग करने वाले दो निम्न कार्यों पर विचार करें।

#include <iostream> 
#include <algorithm> 

namespace zzz 
{ 
    struct X {}; 


void swap(zzz::X&, zzz::X&) 
{ 
    std::cout << "Swapping X\n"; 
} 
} 

template <class T> 
void dumb_swap(T& a, T& b) 
{ 
    std::cout << "dumb_swap\n"; 
    std::swap(a, b); 
} 

template <class T> 
void smart_swap(T& a, T& b) 
{ 
    std::cout << "smart_swap\n"; 
    using std::swap; 
    swap(a, b); 
} 

int main() 
{ 
    zzz::X a, b; 
    dumb_swap(a, b); 
    smart_swap(a, b); 

    int i, j; 
    dumb_swap(i, j); 
    smart_swap(i, j); 
} 

dumb_swap हमेशा std::swap कॉल - भले ही हम नहीं बल्कि zzz::X वस्तुओं के लिए zzz::swap का उपयोग कर पसंद करेंगे।

smart_swap बनाता std::swap फ़ॉल-बैक विकल्प के रूप में दिखाई दे रहा है (उदा जब ints के साथ कहा जाता है), लेकिन जब से यह पूरी तरह से नाम योग्य नहीं है, zzz::swapzzz::X के लिए ADL के माध्यम से इस्तेमाल किया जाएगा।


Subjectively, क्या मुझे इस्तेमाल करने using namespace std; कोड मानक समारोह वस्तुओं के सभी प्रकार का उपयोग करता है, आदि

//copy numbers larger than 1 from stdin to stdout 
remove_copy_if(
    std::istream_iterator<int>(std::cin), std::istream_iterator<int>(), 
    std::ostream_iterator<int>(std::cout, "\n"), 
    std::bind2nd(std::less_equal<int>(), 0) 
); 

IMO लिख रहा है, कोड में इस std:: बस लाइन शोर के लिए बनाता है की तरह बाध्य करती है।

मुझे ऐसे मामलों में using namespace std; एक गंभीर अपराध नहीं मिलेगा, अगर इसे कार्यान्वयन फ़ाइल में उपयोग किया जाता है (लेकिन इसे स्वैप उदाहरण के रूप में भी कार्यक्षेत्र तक सीमित किया जा सकता है)।

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

0

कुछ भी नहीं आपको की आवश्यकता है - जब तक कि आप सी ++ मानक पुस्तकालय के कार्यान्वयनकर्ता नहीं हैं और आप चाहते हैं "नई" और "पुरानी" शैली दोनों में हेडर फ़ाइलों को घोषित करते समय कोड डुप्लिकेशन से बचें:

// cstdio 
namespace std 
{ 
    // ... 
    int printf(const char* ...); 
    // ... 
} 

// stdio.h 
#include <cstdio> 
using namespace std; 

ठीक है, निश्चित रूप से उदाहरण के लिए कुछ हद तक काल्पनिक है (आप समान रूप से अच्छी तरह से इस्तेमाल कर सकते हैं सादा <stdio.h> और यह सब एसटीडी में <cstdio> में डाल), लेकिन Bjarne Stroustrup उसकी में इस उदाहरण दिखाता है।

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

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