Warum ist #include <iostream.h> schlecht?

47

Ich las gerade einen anderen Thread, in dem ein Typ nach C ++ - Büchern für Anfänger fragte, und einer der Programmierer, der antwortete, schrieb Folgendes:

Einige Warnungen: Vermeiden Sie alle Bücher, die eine "Hallo Welt" enthalten

#include <iostream.h>

Ich habe mein C ++ - Buch geöffnet und es enthielt den iostream-Header wie im obigen Beispiel.

Warum ist das so schlimm? Welche weiteren Hinweise sollte ich beim Erlernen von C ++ beachten?

Hintergrund: Ich beherrsche C sehr gut und fange im nächsten Semester an, C ++ zu lernen.

Daniel Scocco
quelle
3
Ein anderer verwandter Zeiger soll cstdionicht enthalten sein stdio.h(letzterer ist veraltet).
Anton Golov
7
@AntonGolov Meinungen sind unterschiedlich. Viele Experten bevorzugen <stdio.h>, da es keinen technischen Grund gibt, warum <cstdio> bevorzugt werden sollte.
Sjoerd
2
@Sjoerd Die Tatsache, dass <cstdio>garantiert die Namen in bereitgestellt werden, namespace stdist Grund genug für mich, es zu bevorzugen. Ich weiß, dass es sie auch im globalen Namensraum bereitstellen <stdio.h> könnte , genauso wie es sie in bereitstellen könntenamespace std . Es ist auch eine Frage der Konsistenz, wenn Sie es sich zur Gewohnheit machen, immer die <c…>Überschriften zu verwenden. Und für einige Header ist dies sehr wünschenswert, da sie beispielsweise die C-Schnittstelle durch zusätzliche Funktionsüberladungen erweitern.
5gon12eder

Antworten:

58

Der Header iostream.h ist kein Standardheader und nicht auf allen Plattformen vorhanden. Tatsächlich existiert es auf meinem System nicht (mit g ++ und der GNU libstdc ++). Daher würde jeder Code, der ihn verwendet, einfach nicht auf meinem System kompiliert.

Der iostream.hHeader verwendet üblich zu sein , bevor C ++ erstmals 1998 standardisiert wurde aber , da die 98 - Standard verwendet <iostream>statt <iostream.h>, hat diese in Ungnade gefallen heraus (als Nicht-Standard und alle) und ist nicht mehr auf allen Plattformen unterstützt. Code, der diesen verwendet, sollte als nicht standardmäßiger Legacy-Code betrachtet werden und ist nicht portierbar. Bücher, in denen es gelehrt wird, sollten als veraltet betrachtet und vermieden werden.

sepp2k
quelle
14
Ich würde ein Buch nicht einfach wegen eines trivialen Präprozessorsyntaxproblems vermeiden. Es könnte ein großartiges Buch sein, während ein schreckliches Buch die moderne Syntax verwenden könnte.
Lord Tydus
21
@Lord Tydus Die Tatsache, dass ein bestimmtes Buch vor 98 ein großartiges Buch sein könnte , negiert nicht die Tatsache, dass Sie statistisch gesehen besser dran sind, Bücher vor 98 zu meiden.
Mike Nakis
12
@ LordTydus: Stimme überhaupt nicht zu. Der Stil und die Verwendung von C ++ sind nicht die gleichen wie in 98, daher werden nicht nur syntaktische Probleme behoben.
Martin York
7
@LordTydus Wenn die alte Syntax einfach ist und auf modernen Compilern nicht kompiliert werden kann, fällt es Ihnen schwer, ein Buch zu verwenden, das die alte Syntax lehrt. Beachten Sie, dass in jedem Buch, in dem die Verwendung von iostream.h beschrieben wird, mit z. B. Namespaces mit ziemlicher Sicherheit auch keine Informationen enthalten sind. Selbst wenn Sie iostream.h durch iostream ersetzen, funktioniert Ihr Code nicht. Wenn Sie zu SO jedes Mal googeln oder um Hilfe bitten müssen, wenn Sie ein Beispiel aus dem Buch kompilieren möchten, ist dies kein sehr effektiver Weg, um C ++ zu lernen.
SEPP2K
3
@ LordTydus: Im Allgemeinen habe ich festgestellt, dass Bücher, die solche Überschriften verwenden, auch schlechte Praktiken verwenden und mit Fehlern durchsetzt sind. Ich habe solche Bücher gesammelt, um sie nicht in Umlauf zu bringen.
greyfade
55

#include <iostream.h>ist ein Zeichen dafür, dass das Buch vor dem ersten C ++ - Standard im Jahr 1998 geschrieben wurde (der Standard-Header ist iostream).

Das Problem ist, dass älterer C ++ - Code in der Regel so geschrieben wird, wie es heutzutage als schlechte Praxis angesehen wird. Speziell,

  • Die Verwendung von Arrays im C-Stil anstelle von Container-Klassen wie std::stringund std::vector.
  • Die Verwendung expliziter closeFunktionen anstelle von RAII.

iostream.hEs ist nicht das Schlimmste, was ein Buch vor 1998 falsch machen wird, aber es ist wahrscheinlich das Erste, was ein Buch vor 1998 falsch machen wird.

dan04
quelle
14
Genagelt es mit Ihrem letzten Absatz.
Leichtigkeit Rennen mit Monica
1

Vielleicht kommt das etwas spät, aber für das, was es wert ist, auf einer Unix / Linux-Box ls /usr/{local/,}include/c++/*oder ähnlichem, je nach Layout und Pfad. Sie können die grepSuche nach dem betreffenden Header wie folgt fortsetzen:

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

Dies beinhaltet eine Suche nach iostream.hwie auch nach anderen Superstrings.

Oder ausführen find / -type f -name iostream 2> /dev/null | grep includeoder locate iostream | grep include(sofern die Datenbank aktuell ist, andernfalls einen Aufruf von voranstellen updatedb) - diese werden jedoch auch nicht systemweite Includes ausgeben, passen Sie sie also entsprechend an. Der eigentliche C ++ - Include-Pfad lässt sich leicht wie folgt ermitteln:

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

Äquivalent zu Windows und anderen Computern. Ich denke, die Idee ist klar - eine Datei, iostream.hdie standardmäßig nicht mehr im System-Include-Pfad vorhanden ist, ist weiterhin verfügbar. Sie können jedoch ältere libc ++ - Distributionen finden, die iostream.hentweder mit einem Softlink iostreamoder als Kopie verknüpft sind . Das ist also keine Frage des Stils, sondern der Umstände. Sie können Ihr eigenes iostream.hProjekt mitliefern, indem Sie sicherstellen, dass es im Include-Pfad enthalten ist, in dem Ihr Compiler nach den <...>Headern sucht .

Nikolaus
quelle
1
Sehr praktisch, spricht aber nicht den eigentlichen Grundgedanken an.
Leichtigkeit Rennen mit Monica
-1

Ich lasse nur meine 2 Cent fallen. Ich glaube nicht, dass es einen Zusammenhang zwischen ".h" und der Qualität eines Buches gibt. Dies ist ein kleines Syntaxproblem. Damals war es eigentlich die richtige Sytnax.

Ist es möglich, mit iostream.h ein großartiges Buch zu haben? Ja

Kann man mit iostream ein schreckliches Buch haben? Ja

Um die Qualität eines Buches beurteilen zu können, würde ich mich auf Online-Benutzerkritiken (und auf meine eigene Rezension nach dem Lesen) verlassen.

Lord Tydus
quelle
3
Das Problem ist, sind Sie sicher, dass Sie ein Buch von "back in the day" wollen?
Hugomg
5
Ist Lisp veraltet, weil es von 1958 ist? Wir verwenden die Arbeit von Pythagoras in jedem modernen Raketensystem, obwohl die Mathematik Jahrtausende alt ist. Auf dem aktuellen C ++ - Buchmarkt können die ".h" -Bücher durchaus schrecklich sein. Aber es ist eine Frage der Qualität des Buches, keine Frage der ".h". ".h" ist nicht einmal Programmierlogik, sondern für den Präprozessor.
Lord Tydus
4
Aber wird jemand, der die Sprache zum ersten Mal lernt, wissen, wann das Buch etwas Falsches sagt? Wie viel Zeit und Frustration werden sie durchmachen, bevor sie herausfinden, dass das ".h" jetzt falsch ist? Und auf wie viele andere Arten ist das Buch veraltet?
Chris Pitman
23
Das Problem ist, dass sich die Verwendung von C ++ seit dem Schreiben dieser Bücher erheblich geändert hat. Die Art und Weise, wie Sie C ++ denken und verwenden, ist nicht die gleiche wie in diesen Büchern, da sie nicht über die Funktionen verfügen, die modernes C ++ bietet. Infolgedessen unterrichten Sie sich selbst C mit Klassen, die nicht C ++ sind.
Martin York
3
@ Giorgio: Langweilig. Was ist mit ACRE? Fortgeschrittene C auf Ritalin mit Ausnahmen. Morgen impliziert auch, dass es viel Boden bedeckt. :-)
Martin York