Mengapa #include <iostream.h> buruk?

47

Saya sedang membaca utas lain di mana seorang pria bertanya tentang buku C ++ untuk pemula, dan salah satu programmer yang menjawab menulis ini:

Beberapa peringatan: hindari semua buku yang menyajikan "hello world" yang menyatakan

#include <iostream.h>

Saya membuka buku C ++ saya dan tentu saja itu termasuk header iostream seperti contoh di atas.

Kenapa itu buruk? Petunjuk apa lagi yang harus saya ingat ketika belajar C ++?

Latar Belakang: Saya mahir dengan C dan saya akan mulai belajar C ++ semester berikutnya.

Daniel Scocco
sumber
3
Lain, terkait pointer, adalah untuk memasukkan cstdio, bukan stdio.h(yang terakhir sudah ditinggalkan).
Anton Golov
7
@AntonGolov Opini berbeda. Banyak ahli lebih suka <stdio.h> karena tidak ada alasan teknis mengapa <cstdio> lebih disukai.
Sjoerd
2
@ Soerd. Fakta yang <cstdio>dijamin untuk memberikan nama namespace stdadalah alasan yang cukup bagi saya untuk memilihnya . Saya tahu bahwa itu mungkin juga memberi mereka ruang-nama global sama seperti yang <stdio.h> bisa mereka sediakan namespace std. Ini juga masalah konsistensi jika Anda membiasakan diri untuk selalu menggunakan <c…>header. Dan untuk beberapa tajuk, Anda akan sangat menginginkan ini karena mereka meningkatkan antarmuka C dengan kelebihan fungsi tambahan, misalnya.
5gon12eder

Jawaban:

58

Header iostream.h adalah header non-standar dan tidak ada di semua platform. Sebenarnya tidak ada di sistem saya (menggunakan g ++ dan GNU libstdc ++). Jadi kode apa pun yang menggunakannya tidak akan dikompilasi di sistem saya.

The iostream.hHeader digunakan untuk menjadi umum sebelum C ++ pertama kali distandarisasi pada tahun 1998. Namun sejak 98 standar yang digunakan <iostream>sebagai pengganti <iostream.h>, yang terakhir telah jatuh dari nikmat (menjadi non-standar dan semua) dan tidak lagi didukung pada semua platform. Kode yang menggunakannya harus dianggap kode warisan non-standar dan tidak portabel. Buku-buku yang mengajarkannya harus dianggap usang dan dihindari.

sepp2k
sumber
14
Saya tidak akan langsung menghindari buku hanya karena masalah sintaksis preprosesor yang sepele. Itu bisa menjadi buku yang hebat sementara buku yang mengerikan bisa menggunakan sintaksis modern.
Lord Tydus
21
@ Lord Tydus Fakta bahwa buku pra-98 apa pun yang diberikan bisa menjadi buku hebat tidak meniadakan fakta bahwa secara statistik, Anda sebaiknya menghindari buku pra-98.
Mike Nakis
12
@ LordTydus: Sama sekali tidak setuju. Gaya dan penggunaan C ++ tidak sama seperti pada 98 sehingga tidak hanya memperbaiki masalah sintaksis.
Martin York
7
@ LordTydus Jika sintaks lama polos dan tidak kompilasi pada kompiler modern, Anda akan kesulitan menggunakan buku yang mengajarkan sintaks lama. Perhatikan bahwa buku apa pun yang mengajarkan penggunaan iostream.h hampir pasti tidak mengajarkan misalnya ruang nama, jadi bahkan setelah mengganti iostream.h dengan iostream, kode Anda tidak akan berfungsi. Jika Anda harus google atau meminta bantuan pada SO setiap kali Anda ingin mengkompilasi contoh dari buku, itu bukan cara yang sangat efektif untuk belajar C ++.
sepp2k
3
@LordTydus: Secara umum, saya menemukan bahwa buku yang menggunakan header seperti itu cenderung juga menggunakan praktik buruk dan penuh dengan kesalahan. Saya telah mengumpulkan buku-buku semacam itu hanya untuk menjaga agar tidak beredar.
greyfade
55

#include <iostream.h>adalah tanda bahwa buku itu ditulis sebelum standar C ++ pertama pada tahun 1998 (header standarnya adalah iostream).

Masalahnya adalah bahwa kode C ++ lama cenderung ditulis dengan cara yang dianggap praktik buruk saat ini. Khususnya,

  • Penggunaan array gaya-C daripada kelas wadah seperti std::stringdan std::vector.
  • Penggunaan closefungsi eksplisit daripada RAII.

iostream.hbukan hal terburuk yang akan terjadi pada buku pra-1998, tetapi kemungkinan hal itu akan menjadi yang pertama bahwa buku pra-1998 akan salah.

dan04
sumber
14
Dipaku dengan paragraf terakhir Anda.
Lightness Races dengan Monica
1

Mungkin ini datang agak terlambat tetapi untuk apa nilainya, pada kotak unix / linux lakukan ls /usr/{local/,}include/c++/*atau serupa, sesuai dengan tata letak dan jalur Anda. Anda dapat memilih untuk grepmencari tajuk yang dimaksud, seperti:

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

Ini memerlukan pencarian untuk iostream.hserta superstring lainnya.

Atau jalankan find / -type f -name iostream 2> /dev/null | grep includeatau locate iostream | grep include(asalkan database saat ini, jika tidak disertai panggilan ke updatedb) - ini, bagaimanapun, akan mencetak juga mencakup seluruh non-sistem, jadi harap sesuaikan dengan tepat. Path C ++ yang sebenarnya mudah ditemukan dengan sesuatu seperti:

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

Setara pada Windows dan mesin lainnya. Saya kira idenya jelas - file seperti iostream.hitu tidak ada dalam sistem termasuk path secara default lagi, Anda masih dapat menemukan distribusi libc ++ lama dengan iostream.hsoft-linked iostreamatau sebagai salinannya. Jadi ini bukan masalah gaya, tetapi keadaan. Anda dapat mengirimkan iostream.hproyek Anda sendiri dengan hanya memastikannya terkandung dalam jalur sertakan tempat kompiler mencari <...>header.

Nicholas
sumber
1
Sangat praktis tetapi tidak benar-benar membahas titik fundamental yang sebenarnya.
Lightness Races dengan Monica
-1

Hanya menjatuhkan 2 sen saya. Saya tidak berpikir ada korelasi antara ". H" dan kualitas buku. Ini adalah masalah sintaksis kecil. Kembali pada hari itu sebenarnya sytnax yang benar.

Apakah mungkin untuk memiliki buku yang bagus dengan iostream.h? Iya

Mungkinkah memiliki buku yang mengerikan dengan iostream? Iya

Saya akan mengandalkan ulasan pengguna online (dan ulasan saya sendiri setelah membaca) untuk menilai kualitas sebuah buku.

Tuan Tydus
sumber
3
Masalahnya adalah, apakah Anda yakin Anda ingin buku dari "kembali pada hari itu?"
hugomg
5
Apakah Lisp ketinggalan jaman karena ini dari tahun 1958? Kami memanfaatkan karya Pythagoras di setiap sistem rudal modern meskipun hitungannya sudah ribuan tahun. Di pasar buku C ++ saat ini, buku ".h" mungkin mengerikan. Tapi ini masalah kualitas buku, bukan masalah ".h". ".h" bahkan bukan logika pemrograman, ini untuk preprocessor.
Lord Tydus
4
tetapi akankah seseorang yang mempelajari bahasa itu untuk pertama kali tahu kapan buku itu mengatakan sesuatu yang salah pada mereka? Berapa banyak waktu dan frustrasi yang akan mereka lalui sebelum mengetahui bahwa ".h" sekarang salah? Dan dalam berapa banyak cara lain buku itu ketinggalan zaman?
Chris Pitman
23
Masalahnya adalah penggunaan C ++ telah berubah secara signifikan sejak buku-buku itu ditulis. Seluruh cara Anda berpikir dan menggunakan C ++ tidak sama dengan buku-buku itu akan hadir karena mereka tidak memiliki fasilitas yang dimiliki C ++ modern. Akibatnya, Anda akan belajar sendiri C dengan kelas bukan C ++.
Martin York
3
@Iorgio: Membosankan. Bagaimana dengan ACRE. Mahir C on Ritalin dengan Pengecualian. Acre juga menyiratkan itu mencakup banyak tanah. :-)
Martin York