ทำไม #include <iostream.h> ไม่ดี


47

ฉันกำลังอ่านหัวข้ออื่นที่ชายคนหนึ่งถามเกี่ยวกับหนังสือ C ++ สำหรับผู้เริ่มต้นและหนึ่งในโปรแกรมเมอร์ที่ตอบรับเขียนสิ่งนี้:

คำเตือนบางอย่าง: หลีกเลี่ยงหนังสือทุกเล่มที่มีคำว่า "สวัสดีโลก" ที่ระบุ

#include <iostream.h>

ฉันเปิดหนังสือ C ++ ของฉันและได้รวมส่วนหัว iostream อย่างที่แสดงไว้ด้านบน

เหตุใดจึงไม่ดี คำแนะนำอื่น ๆ ที่ฉันควรทราบเมื่อเรียนรู้ C ++ คืออะไร

พื้นหลัง: ฉันมีความเชี่ยวชาญใน C และฉันจะเริ่มเรียนรู้ C ++ ภาคการศึกษาถัดไปนี้


3
อีกตัวชี้ที่เกี่ยวข้องคือการรวมcstdioไม่ใช่stdio.h(ตัวหลังถูกคัดค้าน)
Anton Golov

7
@AntonGolov ความคิดเห็นที่แตกต่างกัน ผู้เชี่ยวชาญหลายคนชอบ <stdio.h> เนื่องจากไม่มีเหตุผลทางเทคนิคว่าทำไมควรเลือก <cstdio>
Sjoerd

2
@ Joeerd ความจริงที่<cstdio>รับประกันว่าจะให้ชื่อในnamespace stdนั้นมีเหตุผลเพียงพอสำหรับฉันที่จะชอบมัน ฉันรู้ว่ามันอาจจะยังให้พวกเขาในชื่อพื้นที่ทั่วโลกเช่นเดียวกับที่<stdio.h> อาจnamespace stdให้พวกเขาใน นอกจากนี้ยังเป็นเรื่องของความมั่นคงถ้าคุณทำให้มันเป็นนิสัยที่จะใช้<c…>ส่วนหัว และสำหรับส่วนหัวบางส่วนคุณจะต้องการสิ่งนี้เพราะพวกมันยกระดับอินเตอร์เฟส C ด้วยฟังก์ชั่นเพิ่มเติมของโอเวอร์โหลดตัวอย่างเช่น
5gon12eder

คำตอบ:


58

ส่วนหัว iostream.h เป็นส่วนหัวที่ไม่ได้มาตรฐานและไม่มีอยู่ในทุกแพลตฟอร์ม ตามความเป็นจริงมันไม่มีอยู่ในระบบของฉัน (ใช้ g ++ และ GNU libstdc ++) ดังนั้นรหัสใด ๆ ที่ใช้มันจะไม่รวบรวมในระบบของฉัน

iostream.hส่วนหัวที่ใช้จะเป็นเรื่องธรรมดาก่อน C ++ เป็นมาตรฐานครั้งแรกในปี 1998 แต่เนื่องจากมาตรฐาน 98 ใช้<iostream>แทน<iostream.h>หลังหลุดออกมาจากของที่ระลึก (เป็นที่ไม่ได้มาตรฐานและทั้งหมด) และจะไม่ได้รับการสนับสนุนในทุกแพลตฟอร์ม รหัสที่ใช้ควรถือว่าเป็นรหัสดั้งเดิมที่ไม่ได้มาตรฐานและไม่สามารถพกพาได้ หนังสือที่สอนควรพิจารณาให้ล้าสมัยและหลีกเลี่ยง


14
ฉันจะไม่หลีกเลี่ยงหนังสือที่ถูกต้องเพียงเพราะปัญหาเกี่ยวกับไวยากรณ์ของตัวประมวลผลล่วงหน้าที่น่ารำคาญ มันอาจเป็นหนังสือที่ยอดเยี่ยมในขณะที่หนังสือที่น่ากลัวอาจใช้ไวยากรณ์ที่ทันสมัย
ลอร์ด Tydus

21
@ ลอร์ด Tydus ความจริงที่ว่าหนังสือ pre-98 ที่ได้รับอาจเป็นหนังสือที่ดีไม่ได้คัดค้านความจริงที่ว่าสถิติคุณจะดีกว่าที่จะหลีกเลี่ยงหนังสือ pre-98
Mike Nakis

12
@LordTydus: ไม่เห็นด้วยอย่างสิ้นเชิง สไตล์และการใช้งานของ C ++ นั้นไม่เหมือนกับใน 98 ดังนั้นมันจึงไม่ใช่แค่การแก้ไขปัญหาเกี่ยวกับวากยสัมพันธ์
Martin York เมื่อ

7
@LordTydus ถ้าไวยากรณ์เก่าธรรมดาและเรียบง่ายไม่คอมไพล์ในคอมไพเลอร์สมัยใหม่คุณจะมีเวลายากในการใช้หนังสือที่สอนไวยากรณ์เก่า โปรดทราบว่าหนังสือเล่มใดที่สอนการใช้งาน iostream.h แทบจะไม่ได้สอนเช่น namespaces เช่นกันดังนั้นแม้หลังจากแทนที่ iostream.h ด้วย iostream รหัสของคุณจะไม่ทำงาน หากคุณต้อง google หรือขอความช่วยเหลือเกี่ยวกับ SO ทุกครั้งที่คุณต้องการรวบรวมตัวอย่างจากหนังสือนั่นไม่ใช่วิธีที่มีประสิทธิภาพมากในการเรียนรู้ C ++
sepp2k

3
@LordTydus: โดยทั่วไปแล้วฉันพบว่าหนังสือที่ใช้ส่วนหัวเช่นนั้นมีแนวโน้มที่จะใช้แนวปฏิบัติที่ไม่ดีและเต็มไปด้วยข้อผิดพลาด ฉันเอาไปรวบรวมหนังสือเล่มนี้เพื่อป้องกันไม่ให้
greyfade

55

#include <iostream.h>เป็นเครื่องหมายที่หนังสือเล่มนี้เขียนก่อนมาตรฐาน C ++ แรกในปี 1998 (ส่วนหัวมาตรฐานคือiostream)

ปัญหาคือรหัส C ++ ที่เก่ากว่ามีแนวโน้มที่จะถูกเขียนในรูปแบบที่ถือว่าไม่เหมาะสมในปัจจุบัน โดยเฉพาะอย่างยิ่ง,

  • การใช้อาร์เรย์แบบ C มากกว่าเรียนภาชนะชอบและstd::stringstd::vector
  • การใช้closeฟังก์ชั่นที่ชัดเจนมากกว่า RAII

iostream.hไม่ใช่สิ่งที่เลวร้ายที่สุดที่หนังสือพรี - 1998 จะผิด แต่ก็น่าจะเป็นสิ่งแรกที่หนังสือพรี - 1998 จะผิด


14
ตอกไว้กับย่อหน้าสุดท้ายของคุณ
การแข่งขัน Lightness กับโมนิก้า

1

บางทีนี่อาจจะช้าไปหน่อย แต่สำหรับสิ่งที่ควรค่าแก่การทำบน unix / linux box 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

เท่าเทียมกันบน Windows และเครื่องอื่น ๆ ฉันเดาว่าความคิดนั้นชัดเจน - ไฟล์ที่iostream.hไม่มีอยู่ในระบบรวมถึงเส้นทางโดยค่าเริ่มต้นอีกต่อไปอย่างไรก็ตามคุณยังสามารถค้นหาการกระจาย libc ++ ดั้งเดิมด้วยiostream.hซอฟต์ลิงก์iostreamหรือคัดลอก ดังนั้นนี่ไม่ใช่เรื่องของสไตล์ แต่เป็นสถานการณ์ คุณสามารถจัดส่งของคุณเองiostream.hด้วยโครงการของคุณเพียงตรวจสอบให้แน่ใจว่ามันมีอยู่ในเส้นทางรวมที่คอมไพเลอร์ของคุณค้นหา<...>ส่วนหัว


1
ใช้งานได้จริง แต่ไม่ได้กล่าวถึงประเด็นพื้นฐานที่แท้จริง
การแข่งขัน Lightness กับโมนิก้า

-1

เพียงแค่ลด 2 เซนต์ของฉัน ฉันไม่คิดว่าจะมีความสัมพันธ์ระหว่าง ".h" กับคุณภาพของหนังสือ นี่เป็นปัญหาไวยากรณ์เล็กน้อย ย้อนกลับไปในวันที่มันเป็น sytnax ที่ถูกต้อง

เป็นไปได้หรือไม่ที่จะมีหนังสือดีๆกับ iostream.h ใช่

เป็นไปได้ไหมที่จะมีหนังสือน่ากลัว ๆ ด้วย iostream? ใช่

ฉันจะใช้ความเห็นจากผู้ใช้ออนไลน์ (และความเห็นของฉันเองหลังจากอ่าน) เพื่อตัดสินคุณภาพของหนังสือ


3
ปัญหาคือคุณแน่ใจหรือไม่ว่าคุณต้องการหนังสือจาก "ย้อนกลับไปในวันนี้?"
hugomg

5
เสียงกระเพื่อมล้าสมัยเพราะมาจากปี 1958? เราใช้ประโยชน์จากการทำงานของพีธากอรัสในระบบขีปนาวุธสมัยใหม่ทุกครั้งแม้ว่าคณิตศาสตร์จะมีอายุเป็นพัน ๆ ปี ในตลาดหนังสือ C ++ ปัจจุบันหนังสือ ".h" อาจจะแย่มาก แต่มันคือคุณภาพของปัญหาหนังสือไม่ใช่ปัญหา ".h" ".h" ไม่ได้เป็นตรรกะการเขียนโปรแกรม แต่เป็นสำหรับตัวประมวลผลล่วงหน้า
ลอร์ด Tydus

4
แต่บางคนจะเรียนรู้ภาษาเป็นครั้งแรกรู้ว่าเมื่อหนังสือบอกพวกเขาสิ่งที่ผิด? พวกเขาจะต้องใช้เวลาและความยุ่งยากเท่าไหร่ก่อนที่จะพบว่า ".h" ตอนนี้ไม่ถูกต้อง? และหนังสือเล่มนี้ล้าสมัยไปมากแค่ไหน?
Chris Pitman

23
ปัญหาคือการใช้ C ++ มีการเปลี่ยนแปลงอย่างมีนัยสำคัญตั้งแต่หนังสือเหล่านั้นถูกเขียนขึ้น วิธีที่คุณคิดและใช้ C ++ ไม่เหมือนกับหนังสือเหล่านั้นที่จะนำเสนอเนื่องจากพวกเขาไม่มีสิ่งอำนวยความสะดวกใด ๆ ที่ C ++ ที่ทันสมัยมี เป็นผลให้คุณจะสอนตัวเอง C กับชั้นเรียนไม่ได้ C ++
Martin York

3
@Giorgio: Boring แล้ว ACRE Advanced C ใน Ritalin โดยมีข้อยกเว้น เอเคอร์ยังหมายถึงมันครอบคลุมพื้นดินจำนวนมาก :-)
Martin York
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.