Dlaczego #include <iostream.h> jest zły?

47

Czytałem inny wątek, w którym facet zapytał o książki C ++ dla początkujących, a jeden z programistów, który odpowiedział, napisał:

Niektóre ostrzeżenia: unikaj wszystkich książek, które przedstawiają „witaj świat”

#include <iostream.h>

Otworzyłem moją książkę C ++ i na pewno zawierała nagłówek iostream, jak w powyższym przykładzie.

Dlaczego to takie złe? O jakich innych wskazówkach powinienem pamiętać podczas nauki języka C ++?

Tło: Jestem biegły w C i zacznę uczyć się C ++ w następnym semestrze.

Daniel Scocco
źródło
3
Innym powiązanym wskaźnikiem jest włączenie cstdio, a nie stdio.h(ten drugi jest przestarzały).
Anton Golov,
7
@AntonGolov Opinie są różne. Wielu ekspertów woli <stdio.h>, ponieważ nie ma technicznego powodu, aby wybrać <cstdio>.
Sjoerd,
2
@ Sjoerd Fakt, że <cstdio>gwarantujemy podanie nazwisk, namespace stdjest wystarczającym powodem, dla którego wolę. Wiem, że może to również zapewniać je w globalnej przestrzeni nazw, tak jak <stdio.h> może to zapewnić namespace std. Jest to również kwestia spójności, jeśli nauczysz się zawsze używać <c…>nagłówków. A w przypadku niektórych nagłówków naprawdę tego potrzebujesz, ponieważ rozszerzają one interfejs C na przykład o dodatkowe przeciążenia funkcji.
5gon12eder,

Odpowiedzi:

58

Nagłówek iostream.h jest niestandardowym nagłówkiem i nie istnieje na wszystkich platformach. W rzeczywistości nie istnieje w moim systemie (używając g ++ i GNU libstdc ++). Więc każdy kod, który go użyje, po prostu nie skompiluje się w moim systemie.

iostream.hNagłówek kiedyś Common C ++, zanim po raz pierwszy w 1998 roku standaryzowane Ale ponieważ Standard 98 stosowany <iostream>zamiast <iostream.h>, drugi wypadł z łask (jest niestandardowy i wszystkie) i nie jest już obsługiwany na wszystkich platformach. Kod, który go używa, powinien być uważany za niestandardowy starszy kod i nie jest przenośny. Książki, które tego nauczają, powinny być uważane za przestarzałe i należy ich unikać.

sepp2k
źródło
14
Nie unikałbym książki wprost z powodu trywialnego problemu ze składnią preprocesora. To może być świetna książka, podczas gdy straszna książka może korzystać z nowoczesnej składni.
Lord Tydus,
21
@ Lord Tydus Fakt, że każda książka sprzed 98 lat może być świetną książką, nie neguje faktu, że statystycznie lepiej byłoby unikać książek sprzed 98 lat.
Mike Nakis,
12
@LordTydus: Całkowicie się nie zgadzam. Styl i użycie C ++ nie jest takie samo jak w 98, więc nie tylko rozwiązuje problemy składniowe.
Martin York,
7
@ LordTydus Jeśli stara zwykła składnia i po prostu nie kompiluje się na nowoczesnych kompilatorach, trudno będzie ci użyć książki, która uczy starej składni. Zauważ, że każda książka, która uczy korzystania z iostream.h prawie na pewno nie uczy np. Przestrzeni nazw, więc nawet po zamianie iostream.h na iostream kod nie będzie działał. Jeśli musisz google lub poprosić o pomoc w SO za każdym razem, gdy chcesz skompilować przykład z książki, nie jest to bardzo skuteczny sposób na naukę C ++.
sepp2k
3
@ LordTydus: Ogólnie rzecz biorąc, odkryłem, że książki, które używają takich nagłówków, również stosują złe praktyki i są pełne błędów. Zacząłem zbierać takie książki tylko po to, by nie dopuszczać ich do obiegu.
greyfade
55

#include <iostream.h>jest znakiem, że książka została napisana przed pierwszym standardem C ++ w 1998 r. (standardowy nagłówek to iostream).

Problem polega na tym, że starszy kod C ++ jest zwykle pisany w sposób, który jest dziś uważany za złą praktykę. W szczególności,

  • Zastosowanie tablic w stylu C zamiast klas kontenerów takich jak std::stringi std::vector.
  • Użycie closefunkcji jawnych zamiast RAII.

iostream.hnie jest najgorszą rzeczą, że książka sprzed 1998 roku popełni błąd, ale prawdopodobnie będzie pierwszą rzeczą, w której książka sprzed 1998 roku popełni błąd.

dan04
źródło
14
Przybiłeś go ostatnim akapitem.
Lekkość ściga się z Monicą
1

Może przychodzi to trochę za późno, ale na ile jest to warte, na unixie / linuksie zrób coś ls /usr/{local/,}include/c++/*podobnego, zgodnie z twoim układem i ścieżkami. Możesz grepwyszukiwać nagłówek, o którym mowa, na przykład:

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

To pociąga za sobą poszukiwanie iostream.hzarówno innych superstrun.

Lub uruchom find / -type f -name iostream 2> /dev/null | grep includelub locate iostream | grep include(pod warunkiem, że baza danych jest aktualna, w przeciwnym razie poprzedzaj ją wywołaniem updatedb) - te zostaną jednak wydrukowane również nie dla całego systemu, więc dostosuj odpowiednio. Rzeczywistą ścieżkę dołączania C ++ można łatwo znaleźć za pomocą czegoś takiego:

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

Odpowiednio w systemie Windows i innych komputerach. Myślę, że pomysł jest jasny - taki plik, iostream.hktóry nie istnieje już w systemie, domyślnie zawiera ścieżkę, jednak nadal można znaleźć starsze dystrybucje libc ++ z iostream.hmiękkim dowiązaniem iostreamlub jako jego kopię. To nie jest kwestia stylu, ale okoliczności. Możesz wysłać własny iostream.hprojekt ze swoim projektem, po prostu upewnij się, że jest on zawarty w ścieżce dołączania, w której kompilator szuka <...>nagłówków.

Mikołaj
źródło
1
Bardzo praktyczne, ale tak naprawdę nie odnosi się do prawdziwej podstawowej kwestii.
Lekkość ściga się z Monicą
-1

Po prostu upuszczam moje 2 centy. Nie sądzę, żeby istniała korelacja między „.h” a jakością książki. Jest to niewielki problem ze składnią. Kiedyś był to właściwie sytnax.

Czy w iostream.h można mieć świetną książkę? tak

Czy można mieć okropną książkę z iostream? tak

Oparłbym się na opiniach użytkowników online (i mojej własnej opinii po przeczytaniu), aby ocenić jakość książki.

Lord Tydus
źródło
3
Problem w tym, czy na pewno chcesz książkę z „z powrotem za dnia”?
hugomg,
5
Czy Lisp jest przestarzały, ponieważ pochodzi z 1958 roku? Pracę Pitagorasa wykorzystujemy w każdym nowoczesnym systemie rakietowym, mimo że matematyka ma tysiące lat. Na obecnym rynku książek w C ++ książki „.h” mogą być okropne. Ale jest to jakość wydania książki, a nie kwestia „.h”. „.h” nie jest nawet logiką programowania, jest dla preprocesora.
Lord Tydus,
4
ale czy ktoś uczący się języka po raz pierwszy będzie wiedział, kiedy książka mówi mu coś złego? Ile czasu i frustracji przejdą, zanim dowiedzą się, że „.h” jest teraz niepoprawny? I na ile innych sposobów książka jest nieaktualna?
Chris Pitman,
23
Problem polega na tym, że użycie C ++ zmieniło się znacznie od czasu napisania tych książek. Cały sposób, w jaki myślisz i używasz C ++, nie jest taki sam, jak te książki będą prezentowane, ponieważ nie mają żadnego z udogodnień, jakie ma współczesne C ++. W rezultacie będziesz uczyć się języka C na zajęciach, a nie na C ++.
Martin York,
3
@Giorgio: Nudne. Co z ACRE. Zaawansowany C na Ritalin z wyjątkami. Akr oznacza również, że obejmuje wiele gruntów. :-)
Martin York