2008-10-18 21 views
26

जब सी ++ में एक हेडर फाइल, क्या बीच का अंतर है सहित ...<iostream> बनाम <iostream.h> बनाम "iostream.h"

1) जब यह < में लपेटकर ज सहित नहीं बनाम ज सहित > संकेत?

#include <iostream> vs. #include <iostream.h> 

2) <> संकेत में यह लपेटकर बनाम दोहरे उद्धरण में हैडर नाम लपेटकर?

#include <iostream.h> vs. #include "iostream.h" 

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

+0

देखें [यह सवाल] (http://stackoverflow.com/questions/21593/what-is-the-difference-between-include-filename-and-include-filename) <> और "" के बीच अंतर के लिए । – aib

उत्तर

46

संक्षेप में:

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

बनाम <> बस लाइब्रेरी (अधिकांश कंपाइलरों में) जाने से पहले शीर्षलेख के लिए स्थानीय निर्देशिकाओं की जांच करें।

-Adam

7

यहाँ एक सभ्य लिंक article.

संक्षेप में, कारण नहीं दिया गया है:

iostream पुस्तकालय है कि मानक समिति उत्पादन काफ़ी CFront कार्यान्वयन से अलग था के संस्करण। {कटाव}

लेनदेन की आसानी के, सी ++ मानक समिति कि कोड मानक सी सहित घोषित ++ हेडर निर्देशों में शामिल हैं का प्रयोग करेंगे कि एक विस्तार की कमी है। इसने कंपाइलर विक्रेताओं को पुरानी शैली सी ++ लाइब्रेरी हेडर को .h एक्सटेंशन और नए स्टाइल हेडर के बिना शिप करने की अनुमति दी।

ज संस्करण का उपयोग नहीं का एक लाभ यह:

कई कारण नए कोड ज रूपों के बजाय हेडर फाइल के extensionless संस्करण का उपयोग कर लिखा जाना चाहिए रहे हैं। आधुनिक कंपाइलर्स पर संकलित होने पर पहले ऐसे कोड की अप्रत्याशितता है। जैसा कि पहले उल्लेख किया गया है, .h हेडर का उपयोग करने का परिणाम कार्यान्वयन विशिष्ट है। और समय बीतने के बाद, दिए गए संकलक के पास पुरानी शैली लाइब्रेरी उपलब्ध होगी।

+0

बस जो मैं खोज रहा था, धन्यवाद – Proclyon

1

आमतौर पर <> सिस्टम या मानक लाइब्रेरी फ़ाइलों के लिए उपयोग किया जाता है जबकि "" प्रोजेक्ट फ़ाइलों के लिए उपयोग किया जाता है। यदि आपका कंपाइलर स्थानीय रूप से खोजता है और जब यह नहीं मिल पाता है तो यह आश्चर्यचकित नहीं होगा कि यह मानक लाइब्रेरी संस्करण में डिफ़ॉल्ट है।

.h के लिए, मुझे नहीं लगता कि यह वास्तव में मायने रखता है यदि आप सीसी ++ में उपयोग करते हैं, तो मुझे अस्पष्टता है कि एक नया संस्करण और पुराना संस्करण था और बिना एच के नया संस्करण बनें, लेकिन मुझे यह भी यकीन नहीं है कि पुराना संस्करण अभी भी मौजूद है।

2

मानक तरीका (और केवल एक कार्य करने की गारंटी) <iostream> है। जीसीसी पर, <iostream.h> (जिसे < पिछड़ा/iostream.h > के रूप में शामिल करने की आवश्यकता हो सकती है) प्रासंगिक घोषणाओं को वैश्विक नामस्थान में खींचती है (इसलिए आपको std :: नेमस्पेस उपसर्ग की आवश्यकता नहीं है)।

"iostream.h" आपके स्रोत कोड के साथ निर्देशिका से पहले प्रयास करेगा, क्योंकि "" आपके प्रोजेक्ट से हेडर के लिए है। < > हमेशा सिस्टम हेडर के लिए और अपने हेडर के लिए "" प्रयोग किया जाना चाहिए।

+0

वैश्विक दायरे में ".h" घोषणाओं का उल्लेख करने के लिए अपवोट और std namespace उपसर्ग की आवश्यकता नहीं –

0

पहले उत्तर का सरल जवाब यह है कि कम से कम जीसीसी कार्यान्वयन में iostream.h मौजूद नहीं है। आप * nix, प्रकार

% पर हैं iostream.h पता लगाने
/usr/include/c++/3.4.3/backward/iostream.h

और

% iostream
का पता लगाने /usr/include/c++/3.4.3/iostream
/usr/include/c++/3.4.3/backward/iostream.h

ज़ी के लेख का कहना है के रूप में, iostream.h पिछली संगतता के लिए है।

1

ये वास्तव में दो अलग-अलग प्रश्न हैं।

  • ही नाम के साथ ज और extensionless हेडर के बीच का अंतर ऐतिहासिक है। वाले .h एक्सटेंशन मूल C++ मानक से हैं जो में नामस्थान और टेम्पलेट्स जैसी कुछ आधुनिक विशेषताएं नहीं हैं। यह सरल नए मानक कि नए हेडर फाइल में ही कार्यक्षमता इन नई सुविधाओं का उपयोग करने में सक्षम होना रख दिया और विरासत कोड की पिछली संगतता के लिए वर्ष (ज) फ़ाइलें रखने के लिए के लिए किया गया था।

  • # शामिल के बीच का अंतर < ...> और # शामिल "..." प्रारूप जिस क्रम में संकलक फ़ाइलों के लिए दिखता है। यह आम तौर पर कार्यान्वयन निर्भर है, लेकिन विचार <> प्रारूप लग रहा है कि में प्रणाली पहले निर्देशिका में शामिल हैं, जबकि "" स्रोत फ़ाइल है कि यह #included पहले उसी निर्देशिका में दिखता है।

+1

पहले बिंदु पर एक मामूली सुधार: iostream.h मानक था, और संकलक के बीच अलग था। iostream पहले सी ++ मानक में जोड़ा गया था। – KeithB

5

मानक समिति (X3J16), जो ज है छोड़ना प्रस्तावित पर व्यक्ति के रूप में, मेरी मूल उद्देश्य ज, एच, .hpp, .hxx, या ज ++ फ़ाइल पर बहस व्यवस्थित करने के लिए था एक्सटेंशन; या कुछ लोगों की इच्छा है कि मानक में कोई प्रभाव नहीं है कि यह डिस्क पर एक फ़ाइल का नाम था ताकि किसी आईडीई को संसाधन फ़ाइल की तरह किसी भी जगह से पूर्व-संकलित शीर्षलेख जानकारी खींचने की अनुमति दी जा सके या यहां तक ​​कि संकलक।

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

मानक और पूर्व मानक शीर्षकों के बीच अंतर एक अतिरिक्त लाभ था।

+0

कुछ किताबें पढ़ने के बाद, मैंने अनुमान लगाया है कि '# शामिल करें ' में हमारे कार्यक्रम में iostream.h ** नामक एक ** विशिष्ट फ़ाइल शामिल है, जबकि '#' शामिल है 'बस गारंटी देता है कि' iostream' लाइब्रेरी से संबंधित सब कुछ है हमारे कार्यक्रम में शामिल क्या मैं सही हूँ? –

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