2010-04-16 18 views
5

नीचे 3 प्रोग्रामों के बीच अंतर क्या हैं? <iostream> एक हेडर फ़ाइल या सी ++ मानक लाइब्रेरी है?सी ++ हेडर फ़ाइल समावेशन पर मूल प्रश्न?

1.

#include<iostream> 
using namespace std; 

int main() 
{ 
     return 0; 
} 

2.

#include<iostream> 

int main() 
{ 
     return 0; 
} 

3.

#include<iostream.h> 

int main() 
{ 
     return 0; 
} 

अग्रिम धन्यवाद।

+0

दूसरे कार्यक्रम में, मैंने नामस्थान शामिल नहीं किया है, तो क्या होगा? – siva

+2

आपको लिखना होगा, उदाहरण के लिए, 'cout' के बजाय' std :: cout'। –

+0

यह सिर्फ एक छात्र गृहकार्य की तरह दिखता है ... है ना? – ereOn

उत्तर

1

आप पहले दो कार्यक्रमों मानक सी ++ कार्यक्रमों जबकि 3 कार्यक्रम दायरे में पूरे नाम स्थान std लाता है एक गैर मानक हेडर फाइल <iostream.h>

1 कार्यक्रम using namespace std में उपयोग करता है।

अधिक जानकारी के लिए this पर एक नज़र डालें।

+1

हेडर कभी भी वाई वाई ++ मानक का हिस्सा नहीं था, और इसलिए इसे वास्तव में बहिष्कृत नहीं किया जा सकता है, जिसका सी ++ में एक विशिष्ट तकनीकी अर्थ है। –

+0

@Neil: http://www.devx.com/tips/Tip/14447 स्पष्ट रूप से कहता है कि '' एक बहिष्कृत हेडर फ़ाइल है। '' का उपयोग करने पर हम चेतावनी को अक्षम करने के लिए भी हम जीसीसी के '-नो-बहिष्कृत' विकल्प का उपयोग करते हैं। तो मुझे कारण नहीं मिला कि ' 'को बहिष्कृत क्यों नहीं कहा जा सकता है? कृपया विस्तार से बताएं। –

+1

@ प्र्रासून सौरव: यह devx.com है, मानक नहीं। –

13

जहां तक ​​उत्पादित किया गया है, वहां शून्य अंतर है - क्योंकि iostream लाइब्रेरी में कुछ भी प्रोग्राम द्वारा संदर्भित नहीं किया गया है, पुस्तकालय में से कोई भी किसी भी बुद्धिमान कंपाइलर द्वारा संकलित नहीं किया जाएगा।

जब आप #include <iostream>, तो आप iostream मानक लाइब्रेरी के लिए घोषणाओं के साथ हेडर फ़ाइल भी शामिल कर रहे हैं। #include <iostream.h> का उपयोग अनिवार्य रूप से #include <iostream> जैसा ही है, सिवाय इसके कि यह std:: में होने के विपरीत वैश्विक नामस्थान के भीतर सभी लाइब्रेरी के नामों को परिभाषित करता है - यह उन प्रोग्राम्स के साथ रिवर्स-संगतता के लिए है जो iostream के मूल संस्करण का उपयोग करते थे, जो ड्रॉप नहीं करते थे .h। (<iostream.h> संस्करण भी अक्सर विस्तृत वर्णों, लेकिन केवल मानक char के समर्थन नहीं करते।)

using namespace std; मतलब यह है कि वर्तमान फ़ाइल में नाम संदर्भ के लिए डिफ़ॉल्ट नाम स्थान std है, जो सबसे मानक द्वारा इस्तेमाल किया नाम स्थान है हो जाएगा लाइब्रेरी फ़ंक्शन। हालांकि इसका मतलब है कि आपको std:: के साथ सभी मानक लाइब्रेरी कॉलों को उपसर्ग करने की आवश्यकता नहीं है, इसका मतलब यह भी है कि आपको सावधान रहना होगा कि मानक लाइब्रेरी नामों के साथ ओवरलैप करने वाली किसी भी चीज को परिभाषित न करें।

+2

दरअसल, मेरा मानना ​​है कि 'iostream.h' चीजें वैश्विक नामस्थान में रखती है (भले ही सूर्य के नीचे कोई कंपाइलर वास्तव में ऐसा नहीं करता)। मै गलत हो सकता हूँ। –

+0

आह, ठीक है, अच्छा बिंदु। वह भूल गया था। अपडेट किया गया। – Amber

+3

@ बिली: 'iostream.h' सी ++ मानक में मौजूद नहीं है, इसलिए यह वास्तव में सामान्य रूप से कुछ भी नहीं करता है; एक को कौन सा कार्यान्वयन निर्दिष्ट करना होगा। यह पूर्व-मानक सी ++ से पहले, नामस्थानों से पहले एक अवशेष है, इसलिए किसी भी दिए गए कार्यान्वयन पर ऐसा संभवतः '# शामिल ' जैसा होता है, इसके बाद सभी नामों को वैश्विक नामस्थान में निर्यात करने के निर्देशों का उपयोग किया जाता है। –

2

iostream एक हेडर फ़ाइल है जो घोषणाओं और प्रोटोटाइप प्रदान करती है जो सी ++ मानक पुस्तकालय के हिस्से के लिए एक इंटरफेस हैं।

नहीं है बिंदु जहां #include <iostream> बारे में आपके सिस्टम, एक फ़ाइल "iostream" (कोई विस्तार) कहा जाता है, जो की सामग्री को कॉपी कर रहे हैं और चिपकाया (#include रों की पुनरावर्ती प्रसंस्करण के साथ) पर, है।

#include निर्देश हमेशा हेडर फ़ाइलों की सामग्री में खींचते हैं, वे कभी भी "पुस्तकालय" नहीं जोड़ते हैं। शीर्षलेख फ़ाइलों में प्रायः घोषणाएं और प्रोटोटाइप होते हैं जो लाइब्रेरी के लिए एक इंटरफ़ेस होते हैं, लेकिन वास्तविक पुस्तकालय स्वयं लिंकर द्वारा आपके प्रोग्राम से जुड़े होते हैं, न कि संकलक। एक C++ प्रोग्राम को लिंक करते समय, लिंकर स्वचालित रूप से C++ मानक लाइब्रेरी को तब तक संलग्न करेगा जब तक कि आप इसे न कहें, इसलिए आपको इसके बारे में चिंता करने की आवश्यकता नहीं है।

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

आपके द्वारा दिए गए तीन उदाहरणों के लिए, वे सभी आपको सी ++ मानक पुस्तकालय के iostream भाग का उपयोग करने के लिए आवश्यक परिभाषाएं और प्रोटोटाइप देते हैं, लेकिन (2) पसंद किया जाता है, (1) स्वीकार्य है, और (3) है पदावनत। (2) std:: उपसर्ग (अपने आप को उपयोग करने के लिए उपलब्ध चर नामों को कम करने की लागत पर) को छोड़ने में सक्षम होने की अतिरिक्त सुविधा देता है, और (3) "iostream.h" के बजाय "iostream.h" नामक एक अलग फ़ाइल शामिल है ", जो आम तौर पर एक ही बात है, लेकिन .h के साथ फ़ाइल प्री-स्टैंडर्ड सी ++ का अवशेष है और इसलिए भविष्य के कंपाइलरों में समर्थित नहीं हो सकता है।

3

हेडर फाइल

हैडर iostream.h के साथ कोई समस्या 3 में कोई त्रुटि है एक गैर मानक हेडर है और सभी प्लेटफार्मों पर मौजूद नहीं है। वास्तव में यह मेरे सिस्टम पर मौजूद नहीं है (जी ++ और जीएनयू libstdC++ का उपयोग कर)। तो इसका उपयोग करने वाला कोई भी कोड बस मेरे सिस्टम पर संकलित नहीं होगा।

iostream.h से पहले सी ++ पहले 1998 में मानकीकृत किया गया लेकिन 98 मानक <iostream.h> के बजाय <iostream> इस्तेमाल किया के बाद से आम हुआ करता था हैडर, बाद पक्ष से बाहर (गैर मानक और सभी जा रहा है) गिर और कोई है अब सभी प्लेटफार्मों पर समर्थित है। कोड जो इसका उपयोग करता है उसे गैर मानक विरासत कोड माना जाना चाहिए और पोर्टेबल नहीं है। पुस्तकें जो इसे सिखाती हैं उन्हें पुरानी और टालना माना जाना चाहिए।

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