2010-04-15 11 views
9

का उपयोग करने के लिए सी ++ में नेमस्पेस शामिल करें और उपयोग करें

, मुझे दोनों को निर्दिष्ट करने की आवश्यकता है:

#include<iostream> 

और

using namespace std; 

cout कहां परिभाषित किया गया है? iostream में, सही? तो, यह है कि iostream खुद नामस्थान std में है?

cout का उपयोग करने के संबंध में दोनों बयानों का अर्थ क्या है?

मैं उलझन में हूं कि हमें उन्हें दोनों को शामिल करने की आवश्यकता क्यों है।

+5

@Neil तो SO का उद्देश्य क्या है? केवल उन प्रश्नों से पूछने के लिए जिनके पास कोई पुस्तक पढ़ने या इंटरनेट खोजकर उत्तर देने का कोई तरीका नहीं है? –

+1

@ नील बटरवर्थ: ठीक है! किसी पुस्तक से अवधारणाओं को पढ़ने के बिना, इस के बाद कोई और बेवकूफ सवाल नहीं। – Moeb

+6

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

उत्तर

9

iostream फ़ाइल का नाम है जहां कोउट परिभाषित किया गया है। दूसरी तरफ, std एक नामस्थान है, समकक्ष (कुछ अर्थ में) जावा के पैकेज में।

cout std नेमस्पेस के अंदर iostream फ़ाइल में परिभाषित एक उदाहरण है।

एक और नामस्थान में cout उदाहरण मौजूद हो सकता है। तो संकेत मिलता है कि आप std नाम स्थान से cout उदाहरण का उपयोग करना चाहते हैं, तो आप

std::cout लिखना चाहिए, गुंजाइश का संकेत है।

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

हर जगह std:: बचने के लिए आप using खंड का उपयोग कर सकते हैं।

cout<<"Hello world"<<endl; 

वे दो अलग-अलग चीजें हैं। एक गुंजाइश इंगित करता है, दूसरा cout का वास्तविक समावेशन करता है।

जवाब में अपनी टिप्पणी

लिए कल्पना कीजिए iostream में है कि दो उदाहरणों नामित cout मौजूद हैं, अलग नामस्थान

namespace std{ 
    ostream cout; 
} 
namespace other{ 
    float cout;//instance of another type. 
} 

में <iostream> सहित के बाद, आप अभी भी नाम स्थान निर्दिष्ट करने की आवश्यकता होगी। #include कथन नहीं कहता है "अरे, std :: में cout का उपयोग करें"। using क्या है,

+1

@ टॉम: जब मैंने पहले से ही फ़ाइल ('iostream') शामिल की है, तो मैंने निर्दिष्ट किया है कि 'cout' का उपयोग करने के लिए कौन सी परिभाषा है। अब संकलक जानता है कि उपयोग करने के लिए क्या परिभाषा है। तो, फिर समस्या क्या है। मैं अभी भी उलझन में हूं कि मुझे यह कहने की ज़रूरत क्यों है कि यह 'std' नेमस्पेस में है। अगर कुछ भ्रम हो तो यह आवश्यक होना चाहिए था। यहां, कोई भ्रम नहीं है क्योंकि 'cout' की केवल एक ही परिभाषा है। – Moeb

+0

कृपया मेरे अपडेट किए गए उत्तर को देखें – Tom

+0

@cambr: नहीं, आपने उपयोग करने के लिए 'cout' की परिभाषा निर्दिष्ट की है। ऐसा कोई कारण नहीं है कि आप 'int cout' को परिभाषित नहीं कर सके; बाद में, हालांकि यह एक अच्छा विचार नहीं है। तर्कसंगत रूप से, सी ++ मानक के लिए आवश्यक हो सकता है कि दिए गए प्रतीक के साथ केवल एक नामस्थान है, लेकिन ऐसा नहीं किया गया है, और मैं नामस्थानों का उपयोग कर एक भाषा के बारे में नहीं सोच सकता जहां यह करता है। –

1

cout को तर्कसंगत रूप से Iostream के भीतर परिभाषित किया गया है। तार्किक रूप से, मेरा मतलब है कि यह वास्तव में फ़ाइल iostream में हो सकता है या यह iostream से शामिल कुछ फ़ाइल में हो सकता है। Iostream सहित किसी भी तरह से cout की परिभाषा प्राप्त करने का सही तरीका है।

आईस्ट्रीम में सभी प्रतीकों नामस्थान std में हैं। cout प्रतीक का उपयोग करने के लिए, आपको संकलक को यह बताना होगा कि यह कैसे ढूंढें (यानी किस नामस्थान)।

// explicit 
std::cout << std::endl; 

// import one symbol into your namespace (other symbols must still be explicit) 
using std::cout; 
cout << std::endl; 

// import the entire namespace 
using namespace std; 
cout << endl; 

// shorten the namespace (not that interesting for standard, but can be useful 
// for long namespace names) 
namespace s = std; 
s::cout << s::endl; 
0

#include <iostream> संदर्भ हेडर फाइल है कि अदालत को परिभाषित करता है: आप विकल्पों की एक जोड़ी है। यदि आप कोउट का उपयोग करने जा रहे हैं, तो आपको हमेशा शामिल करने की आवश्यकता होगी।

आपको using namespace std; की आवश्यकता नहीं है। यह आपको आसानी से और endl और std::cout और std::endl के बजाय शॉर्टलैंड का उपयोग करने की अनुमति देता है जहां नामस्थान स्पष्ट है। व्यक्तिगत रूप से मैं using namespace ... का उपयोग नहीं करना पसंद करता क्योंकि यह मुझे मेरे अर्थ में स्पष्ट होने की आवश्यकता है, हालांकि यह स्वीकार्य रूप से अधिक verbose है।

+1

समझौता 'std :: cout का उपयोग कर रहा है; std :: endl; 'का उपयोग करके, जिसके बाद आप' cout' और 'endl' का उपयोग योग्यता के बिना कर सकते हैं, पूरे' std' नेमस्पेस को वैश्विक नेमस्पेस में लाए बिना। –

2

अपने सी ++ कार्यान्वयन सी शैली हेडर फाइल (कई करते हैं) फिर वहाँ एक फ़ाइल है कि करने के लिए कुछ इसी तरह होता है का उपयोग करता है:

#include ... // bunches of other things included 

namespace std { 

... // various things 

extern istream cin; 
extern ostream cout; 
extern ostream cerr; 

... // various other things 

} 

एसटीडी नाम स्थान कि सी ++ मानक मानक चीजों में से सबसे कहते है चाहिए इसमें रहते हैं। यह वैश्विक नामस्थान को अधिक से अधिक रखने से है, जो आपको अपने स्वयं के वर्गों, चर, और कार्यों के नामों के साथ आने में कठिनाई का कारण बन सकता है जो पहले से ही मानक चीजों के नाम के रूप में उपयोग नहीं किए जाते हैं।

using namespace std; 

कह आप संकलक है कि आप इसे वैश्विक नामस्थान के अतिरिक्त नाम स्थान एसटीडी में खोज करना चाहते हैं के नाम को देख कह रहे हैं। संकलक स्रोत लाइन देखता है: जब तक यह एक foo कि उस लाइन की आवश्यकताओं को पूरा पाता

return foo(); 

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

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