2013-05-12 5 views
15

मैंने सी ++ सीखना शुरू किया और मैंने एक पुस्तक पढ़ी जो लिखती है कि मुझे <string> हेडर फ़ाइल का उपयोग करना चाहिए क्योंकि स्ट्रिंग प्रकार सीधे कंपाइलर में नहीं बनाया गया है। यदि मैं <iostream> का उपयोग करता हूं तो मैं स्ट्रिंग प्रकार का उपयोग कर सकता हूं।क्या मुझे <iostream> के बगल में # शामिल <string> का उपयोग करना है?

क्या मुझे <string> शीर्षलेख शामिल करना है जब मैं स्ट्रिंग प्रकार का उपयोग करना चाहता हूं यदि मैंने <iostream> हेडर शामिल किया है? क्यूं कर? क्या कोई अंतर है?

उत्तर

17

हां, आपको जो भी उपयोग करना है उसे शामिल करना होगा। यह अनिवार्य नहीं है कि मानक शीर्षलेखों में एक-दूसरे शामिल हैं (कुछ अपवाद IIRC के साथ)। यह अब काम कर सकता है, लेकिन एक अलग संकलक पर असफल हो सकता है।

आपके मामले में, स्पष्ट रूप से <iostream> में सीधे या अप्रत्यक्ष रूप से <string> शामिल है, लेकिन इस पर भरोसा न करें।

+0

यह शायद स्ट्रिंग की एक अगली घोषणा है ( में शामिल है जिसमें आईएनजी जीसीसी के कार्यान्वयन शामिल हैं)। मुझे लगता है कि यह मानक व्यवहार है (हालांकि मानक को जांचना होगा), इसलिए मेरा मानना ​​है कि वह उस पर भरोसा कर सकता है जब उसे पूर्ण प्रकार की आवश्यकता नहीं होती है। – Aleph

+0

@AnotherTest "मैं स्ट्रिंग प्रकार का उपयोग कर सकता हूं" - मुझे बताता है कि उसे पूर्ण प्रकार की आवश्यकता है। यदि वह नहीं करता है, तो आगे की घोषणा होगी, हां। –

+0

27.5.1 बताता है कि में शामिल होना चाहिए। उसे केवल 'char_traits' की आवश्यकता है, इसलिए मुझे यकीन नहीं है कि एक कंपाइलर को' स्ट्रिंग 'घोषित करना होगा या नहीं। मुझे अभी भी संदेह है कि iostream के किसी भी कार्यान्वयन में संपूर्ण स्ट्रिंग हेडर शामिल है। – Aleph

7

मैं <string> हेडर को शामिल करने के लिए जब मैं अगर मैं <iostream> हैडर शामिल स्ट्रिंग प्रकार का उपयोग करना चाहते है?

हां, आपको करना होगा। आप अन्य शीर्षकों (उदा। <iostream>) के माध्यम से अप्रत्यक्ष रूप से #include डी होने पर प्रासंगिक शीर्षलेखों (उदा। <string>) पर भरोसा नहीं कर सकते हैं, हालांकि यह कुछ कार्यान्वयन पर मामला हो सकता है।

और यहां तक ​​कि जब इस लगते हैं काम करने के लिए हो सकता है, यह मुसीबतों को नहीं तो कुछ ऑपरेटरों के संगत भार के के सभी ले जा सकता है आयात किया जाता है, या एक वर्ग एक हैडर आप #include में आगे की घोषणा की जाती है, लेकिन जानकारी अगर पर उस वर्ग को किसी अन्य वर्ग से प्राप्त किया जा रहा है केवल उस शीर्षलेख में निहित है जिसे #include डी नहीं मिलता है।

उदाहरण के लिए, this Q&A on StackOverflow ऐसी परिस्थितियों के उदाहरण के लिए देखें।

+0

[ios_base :: getloc] (http://en.cppreference.com/w/cpp/io/ios_base/getloc) मान द्वारा 'std :: locale' देता है, और [लोकेल :: नाम] (http://en.cppreference.com/w/cpp/locale/locale/name) मान द्वारा 'std :: string' देता है, इसलिए '#d38e ' वास्तव में' std :: string' को पूरी तरह से परिभाषित करने के लिए आवश्यक है। ' 'से केवल गैर-सदस्य वैकल्पिक हैं। – Cubbi

+0

बहुत अच्छा बिंदु। मैं बस एक ऐसे मुद्दे में भाग गया जहां हम जिस लाइब्रेरी कोड का उपयोग कर रहे हैं उस पर निर्भर है और जब हमने एक पुराने संस्करण में एक पुराने ओएस/कंपाइलर से अपग्रेड किया है, तो संकलन इसके अलावा "कोई स्पष्ट कारण" नहीं है। – user320781

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