#İnclude <iostream.h> neden kötü?


47

Bir adamın yeni başlayanlar için C ++ kitaplarını sorduğu ve cevaplayan programcılardan birinin şunu yazdığı başka bir konu okuyordum :

Bazı uyarılar: "Merhaba dünya" sunan tüm kitaplardan kaçının

#include <iostream.h>

C ++ kitabımı açtım ve yukarıdaki örnekte olduğu gibi iostream başlığını içerdiğinden eminim.

Bu neden kötü? C ++ 'ı öğrenirken hangi diğer akılda tutmalıyım?

Arkaplan: C konusunda uzmanım ve önümüzdeki dönem C ++ öğrenmeye başlayacağım.


3
Bir diğer, ilgili işaretçi, içermez cstdio, değil stdio.h(ikincisi kullanımdan kaldırılmıştır).
Anton Golov

7
@AntonGolov Görüşler farklı. Pek çok uzman <cddio> 'nun tercih edilmesinin teknik bir nedeni olmadığı için <stdio.h>' yi tercih eder.
Sjoerd

2
@Sjoerd İsimleri vermenin <cstdio>garanti edilmesi gerçeği namespace stdtercih etmem için yeterli bir neden. Bunun olabileceğini biliyoruz da küresel isim uzayda tıpkı bunları sağlamak <stdio.h> olabilir bunları sağlamak namespace std. Her zaman <c…>başlıkları kullanmayı alışkanlık haline getirirseniz, aynı zamanda bir tutarlılık meselesidir . Bazı başlıklar için bunu gerçekten isteyeceksiniz, çünkü C arayüzünü, örneğin ek fonksiyon aşırı yüklemeleriyle geliştiriyorlar.
5gon12eder

Yanıtlar:


58

İostream.h başlığı standart olmayan bir başlıktır ve tüm platformlarda mevcut değildir. Aslında sistemimde mevcut değil (g ++ ve GNU libstdc ++ kullanarak). Yani onu kullanan herhangi bir kod sistemimde derlenmeyecek.

Daha iostream.hönce C ++ 'dan önce kullanılan başlık ilk önce 1998'de standardize edildi. Ancak, <iostream>bunun yerine kullanılan 98 standardı <iostream.h>olduğundan, ikincisi lehine düştü (standart dışı ve tümü) ve artık tüm platformlarda desteklenmiyor. Bunu kullanan kod, standart olmayan eski kod olarak kabul edilmelidir ve taşınabilir değildir. Öğreten kitapların modası geçmiş ve kaçınılması gerektiği düşünülmelidir.


14
Önemsiz bir önişlemci sözdizimi sorunu yüzünden bir kitaptan düpedüz uzak durmam. Modern bir sözdizimi kullanarak korkunç bir kitap olabilirken harika bir kitap olabilir.
Lord Tydus

21
@ Lord Tydus 98 kitap öncesi verilen herhangi bir kitabın harika bir kitap olabileceği gerçeği, 98 kitap öncesi kitap kullanmaktan kaçınmanın daha iyi olacağı gerçeğini reddetmez.
Mike Nakis

12
@ LordTydus: Tamamen katılmıyorum. C ++ stili ve kullanımı 98 ile aynı değil, bu yüzden sadece sözdizimsel sorunları düzeltmiyor.
Martin York

7
@ LordTydus Eski sözdizimi düz ve modern derleyiciler üzerinde derlenmiyorsa, eski sözdizimini öğreten bir kitap kullanmakta zorlanacaksınız. İostream.h dosyasının kullanımını öğreten herhangi bir kitabın, örneğin kesinlikle iostream.h ifadesini iostream ile değiştirdikten sonra bile, örneğin ad alanlarını da öğretmediğini unutmayın. Kitaptan bir örnek derlemek istediğinizde google veya SO hakkında yardım istemeniz gerekiyorsa, bu C ++ öğrenmenin çok etkili bir yolu değildir.
sepp2k

3
@ LordTydus: Genel olarak, bu gibi başlıkları kullanan kitapların kötü uygulamaları kullanma eğiliminde olduğunu ve hatalarla uğraştığını gördüm. Bunları sadece dolaşımdan uzak tutmak için
greyfade

55

#include <iostream.h>kitabın 1998'de ilk C ++ standardından önce yazıldığının bir işaretidir (standart başlık iostream).

Sorun şu ki, eski C ++ kodunun bugün kötü uygulama olarak kabul edilen şekillerde yazılması eğilimindedir. Özellikle,

  • C tarzı diziler yerine gibi konteyner sınıfların kullanımı std::stringve std::vector.
  • Açık closeişlevlerin RAII yerine kullanımı .

iostream.h1998 öncesi bir kitabın yanlış yapacağı en kötü şey değil , ancak 1998 öncesi bir kitabın yanlış yapacağı ilk şey olabilir.


14
Son paragrafınızla çivilenmiş.
Monica

1

Belki bu biraz geç gelir ama bunun için, bir unix / linux kutusundaki ls /usr/{local/,}include/c++/*ya da benzeri bir düzende düzeninize ve yollarınıza göre değer. grepAşağıdaki gibi bir başlık arayarak boru çekebilirsiniz :

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

Bu, iostream.hdiğer batıl inançların yanı sıra bir de arama gerektirir .

Veya çalıştırın find / -type f -name iostream 2> /dev/null | grep includeveya locate iostream | grep include(veritabanının geçerli olması şartıyla, aksi takdirde bir çağrı ile hazırlanın updatedb) - bunlar sistem dışı da dahil olmak üzere yazdıracaklardır, lütfen uygun şekilde ayarlayın. Gerçek C ++ içerme yolu, şöyle bir şeyle kolayca bulunur:

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

Eşdeğer olarak Windows ve diğer makinelerde. Bence fikir açıktır - iostream.hsistemde mevcut olmayan bir dosya varsayılan olarak artık yolunu içerir, ancak yine de, eski libc ++ dağıtımlarını iostream.hya yumuşak bağlantılı iostreamya da kopyası olarak bulabilirsiniz. Yani bu bir tarz meselesi değil şartlar değil. Sen kendi gemi olabilir iostream.hsizin derleyici için arar yolu dahil sadece emin içerdiği oluyor yapmak Projenizle <...>başlıklarını.


1
Çok pratik ama asıl mesele gerçekten ele alınmıyor.
Monica

-1

Sadece 2 sentimi düşürüyorum. ".H" ile kitabın kalitesi arasında bir ilişki olduğunu sanmıyorum. Bu küçük bir sözdizimi sorunudur. Günün sonunda aslında doğru sytnax oldu.

İostream.h ile harika bir kitap olması mümkün mü? Evet

İostream ile korkunç bir kitap olması mümkün mü? Evet

Bir kitabın kalitesini değerlendirmek için çevrimiçi kullanıcı incelemelerine (ve okuduktan sonra kendi yorumuma) güvenecektim.


3
Sorun şu ki, "geri döndüğümde" bir kitap istediğinden emin misin?
hugomg

5
Lisp modası geçmiş mi, çünkü 1958'den mi? Matematik binlerce yıllık olsa bile, Pythagoras'ın çalışmalarını her modern füze sisteminde kullanıyoruz. Mevcut C ++ kitap pazarında ".h" kitapları çok korkunç olabilir. Ancak bu, ".h" sayısının değil, kitap sayısının kalitesidir. ".h" programlama mantığını bile bilmiyor, önişlemciler için.
Lord Tydus

4
Fakat ilk defa dili öğrenen biri, kitabın ne zaman yanlış bir şey söylediğini anlayacak mı? ".H" nin şimdi yanlış olduğunu fark etmeden önce ne kadar zaman ve hayal kırıklığı yaşayacaklar? Ve kitap kaç başka şekilde güncel değil?
Chris Pitman

23
Sorun şu ki, C ++ kullanımı bu kitaplar yazıldığından bu yana önemli ölçüde değişmiş. C ++ 'ı düşünme ve kullanma şekliniz, modern C ++' nın sahip olduğu hiçbir donanıma sahip olmadıkları için, kitapların sunacakları ile aynı değildir. Sonuç olarak, kendinize C ++ değil, C sınıflarını öğreteceksiniz.
Martin York

3
@ Giorgio: Sıkıcı. ACRE'den ne haber. İstisnalar ile Ritalin'de İleri Düzey C. Acre ayrıca çok fazla toprak kapladığını da ima eder. :-)
Martin York
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.