#Include <iostream.h> खराब क्यों है?


47

मैं एक और सूत्र पढ़ रहा था, जहाँ एक व्यक्ति ने शुरुआती लोगों के लिए C ++ पुस्तकों के बारे में पूछा, और उत्तर देने वाले प्रोग्रामरों में से एक ने यह लिखा:

कुछ चेतावनियाँ: उन सभी पुस्तकों से बचें जो "हैलो वर्ल्ड" प्रस्तुत करती हैं

#include <iostream.h>

मैंने अपनी C ++ पुस्तक खोली और यह सुनिश्चित किया कि इसमें ऊपर दिए गए उदाहरण की तरह iostream हेडर शामिल हो।

वह बुरा क्यों है? C ++ सीखने के दौरान मुझे और किन बिंदुओं को ध्यान में रखना चाहिए?

पृष्ठभूमि: मैं सी के साथ कुशल हूं और मैं अगले सेमेस्टर में सी ++ सीखना शुरू करूंगा।


3
एक और, संबंधित सूचक को शामिल करना है cstdio, नहीं stdio.h(बाद में पदावनत है)।
एंटोन गोलोव

7
@AntonGolov राय अलग। कई विशेषज्ञ <stdio.h> पसंद करते हैं क्योंकि कोई तकनीकी कारण नहीं है कि <cstdio> को क्यों पसंद किया जाना चाहिए।
सोज़ेरड

2
@Sjoerd यह तथ्य कि <cstdio>नाम प्रदान करने की गारंटी namespace stdहै, मेरे लिए इसे पसंद करने के लिए पर्याप्त कारण है। मुझे पता है कि यह हो सकता है भी बस के रूप में वैश्विक नाम-अंतरिक्ष में उन्हें प्रदान <stdio.h> कर सकते हैं में उन्हें प्रदान namespace std। यदि आप इसे हमेशा <c…>हेडर का उपयोग करने की आदत बनाते हैं, तो यह भी एक सामंजस्य की बात है । और कुछ हेडर के लिए, आप वास्तव में यह चाहते हैं क्योंकि वे अतिरिक्त फ़ंक्शन ओवरलोड के साथ सी इंटरफ़ेस बढ़ाते हैं, उदाहरण के लिए।
5gon12eder

जवाबों:


58

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

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


14
मैं केवल एक तुच्छ पूर्वप्रक्रमक वाक्यविन्यास समस्या के कारण एक पुस्तक से बचना नहीं चाहूंगा। यह एक महान पुस्तक हो सकती है जबकि एक भयानक पुस्तक आधुनिक वाक्य रचना का उपयोग कर सकती है।
लॉर्ड टाइडस

21
@ लॉर्ड टाइडस तथ्य यह है कि किसी भी पूर्व -98 पुस्तक एक महान पुस्तक हो सकती है इस तथ्य को नकारा नहीं जाता है कि सांख्यिकीय रूप से, आप प्री -98 पुस्तकों से बचना बेहतर होगा।
माइक नाकिस

12
@ लॉर्डस: पूरी तरह से असहमत। C ++ की शैली और उपयोग 98 में समान नहीं है और इस प्रकार यह सिंटैक्टिक मुद्दों को ठीक नहीं कर रहा है।
मार्टिन

7
@LordTydus यदि पुराने सिंटैक्स सादे और बस आधुनिक संकलक पर संकलित नहीं होते हैं, तो आपके पास एक पुरानी पुस्तक सिंटैक्स सिखाने वाली पुस्तक का उपयोग करने का कठिन समय होगा। ध्यान दें कि कोई भी पुस्तक जो iostream.h का उपयोग सिखाती है, लगभग निश्चित रूप से जैसे नामस्थानों को नहीं सिखाती है, इसलिए iostream.h को iostream के साथ बदलने के बाद भी, आपका कोड काम नहीं करेगा। यदि आपको Google से या एसओ से हर बार मदद के लिए पूछना है, तो आप पुस्तक से एक उदाहरण संकलित करना चाहते हैं, यह C ++ सीखने का एक बहुत प्रभावी तरीका नहीं है।
sepp2k

3
@ लॉर्डटस: सामान्य तौर पर, मैंने पाया है कि किताबें जो हेडर का उपयोग करती हैं, वे भी बुरी प्रथाओं का उपयोग करती हैं और त्रुटियों के कारण छंट जाती हैं। मैंने उन्हें संचलन से बाहर रखने के लिए
ग्रेफेड 17

55

#include <iostream.h>यह संकेत है कि पुस्तक 1998 में पहले C ++ मानक (मानक हेडर है iostream) से पहले लिखी गई थी ।

समस्या यह है कि पुराने C ++ कोड को उन तरीकों से लिखा जाता है जिन्हें आज बुरा व्यवहार माना जाता है। विशेष रूप से,

  • कंटेनर वर्गों std::stringऔर जैसे सी-स्टाइल सरणियों का उपयोग और std::vector
  • closeRAII के बजाय स्पष्ट कार्यों का उपयोग ।

iostream.hनहीं है सबसे खराब बात यह है कि एक पूर्व 1998 के पुस्तक गलत होगा, लेकिन यह संभावना हो करने के लिए पहली बात यह है कि एक पूर्व 1998 के पुस्तक गलत मिल जाएगा।


14
अपने अंतिम पैराग्राफ के साथ इसे नामांकित किया।
मोनिका

1

हो सकता है कि यह थोड़ा देर से आए लेकिन ls /usr/{local/,}include/c++/*आपके लेआउट और रास्तों के अनुसार, यूनिक्स / लिनक्स बॉक्स में या इसके समान है। आप grepशीर्ष लेख की तलाश में पाइप कर सकते हैं , जैसे:

ls /usr/{local/,}include/c++/* | grep iostream 

यह लुक-अप के iostream.hसाथ-साथ किसी भी अन्य सुपरस्ट्रिंग के लिए मजबूर करता है।

या चलाएं find / -type f -name iostream 2> /dev/null | grep includeया locate iostream | grep include(बशर्ते डेटाबेस चालू है, अन्यथा कॉल के साथ प्रस्तुत करना updatedb) - ये, हालांकि, गैर-सिस्टम-वाइड शामिल भी प्रिंट करेंगे, इसलिए कृपया उचित रूप से समायोजित करें। वास्तविक C ++ में पथ आसानी से पाया जाता है जैसे कि:

g++ -v 2>&1| sed -rn 's/.+gxx-include[^=]+=([^ ]+).+/\1/p' # adjust iff empty

विंडोज और अन्य मशीनों पर समान रूप से। मुझे लगता है कि यह विचार स्पष्ट है - इस तरह की फाइल iostream.hसिस्टम में मौजूद नहीं है, इसमें डिफ़ॉल्ट रूप से पथ शामिल है, आप अभी भी, हालांकि, लीगेसी libc ++ वितरण को iostream.hसॉफ्ट-लिंक्ड iostreamया इसकी प्रतिलिपि के रूप में पा सकते हैं । तो यह शैली का मामला नहीं है, बल्कि परिस्थितियों का है। आप iostream.hअपने प्रोजेक्ट के साथ खुद को जहाज कर सकते हैं बस सुनिश्चित करें कि इसमें शामिल पथ शामिल है जहां आपका कंपाइलर <...>हेडर के लिए दिखता है ।


1
बहुत व्यावहारिक है, लेकिन वास्तव में वास्तविक मौलिक बिंदु को संबोधित नहीं करता है।
मोनिका

-1

बस मेरे 2 सेंट छोड़ने। मुझे नहीं लगता कि ".h" और एक पुस्तक की गुणवत्ता के बीच एक संबंध है। यह एक मामूली वाक्यविन्यास मुद्दा है। दिन में वापस यह वास्तव में सही सिंटैक्स था।

क्या iostream.h के साथ एक महान पुस्तक होना संभव है? हाँ

क्या आईस्ट्रीम के साथ एक भयानक पुस्तक होना संभव है? हाँ

मैं एक पुस्तक की गुणवत्ता का न्याय करने के लिए ऑनलाइन उपयोगकर्ता समीक्षाओं (और पढ़ने के बाद मेरी अपनी समीक्षा) पर भरोसा करता हूं।


3
समस्या यह है, क्या आप सुनिश्चित हैं कि आप "दिन में वापस" से एक किताब चाहते हैं?
हुगोमग

5
क्या लिस्प पुराना है क्योंकि यह 1958 से है? हम हर आधुनिक मिसाइल प्रणाली में पाइथागोरस के काम का उपयोग करते हैं, भले ही गणित हजारों साल पुराना हो। वर्तमान C ++ पुस्तक बाजार में ".h" पुस्तकें अच्छी तरह से भयानक हो सकती हैं। लेकिन यह पुस्तक के मुद्दे का एक गुण है, न कि ".एच" मुद्दा। ".h" प्रोग्रामिंग लॉजिक भी नहीं है, यह प्रीप्रोसेसर के लिए है।
लॉर्ड टाइडस

4
लेकिन क्या कोई पहली बार भाषा सीखेगा जब किताब उन्हें कुछ गलत बता रही हो? यह पता लगाने से पहले कि वे ".एच" अब कितना गलत है, कितना समय और निराशा से गुजरेंगे? और पुस्तक कितने अन्य तरीकों से पुरानी है?
क्रिस पिटमैन

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

3
@ जियोर्जियो: बोरिंग। ACRE के बारे में क्या। अपवादों के साथ Ritalin पर उन्नत सी। एकर भी तात्पर्य है कि यह बहुत सारे जमीन को कवर करता है। :-)
मार्टिन यॉर्क
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.