it-swarm.dev

Warum ist #include <iostream.h> schlecht?

Ich las ein anderer Thread wo ein Typ nach C++ - Büchern für Anfänger fragte und einer der antwortenden Programmierer dies schrieb:

Einige Warnungen: Vermeiden Sie alle Bücher, in denen eine "Hallo Welt" angegeben ist

#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 anderen Hinweise sollte ich beim Erlernen von C++ beachten?

Hintergrund: Ich beherrsche C und werde im nächsten Semester C++ lernen.

48
Daniel Scocco

Der Header iostream.h ist ein nicht standardmäßiger Header und existiert nicht auf allen Plattformen. Tatsächlich existiert es auf meinem System nicht (unter Verwendung von g ++ und GNU libstdc ++). Daher würde jeder Code, der es verwendet, einfach nicht auf meinem System kompiliert.

Der iostream.h - Header war vor der ersten Standardisierung von C++ im Jahr 1998 üblich. Da der 98-Standard jedoch <iostream> Anstelle von <iostream.h> Verwendete, ist letzterer in Ungnade gefallen nicht standardmäßig und alle) und wird nicht mehr auf allen Plattformen unterstützt. Code, der ihn verwendet, sollte als nicht standardmäßiger Legacy-Code betrachtet werden und ist nicht portierbar. Bücher, die es lehren, sollten als veraltet betrachtet und vermieden werden.

58
sepp2k

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

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

  • Die Verwendung von Arrays im C-Stil anstelle von Containerklassen wie std::string und std::vector.
  • Die Verwendung expliziter close -Funktionen anstelle von RAII.

iostream.h ist nicht die schlimmste Sache, die ein Buch vor 1998 falsch machen wird, aber es ist wahrscheinlich die erste Sache, die ein Buch vor 1998 falsch machen wird.

56
dan04

Vielleicht kommt dies etwas spät, aber für das, was es wert ist, tun Sie auf einer Unix/Linux-Box ls /usr/{local/,}include/c++/* Oder ähnliches, je nach Layout und Pfaden. Sie können zu grep weiterleiten und nach dem betreffenden Header suchen, z.

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

Dies beinhaltet eine Suche nach iostream.h Sowie nach anderen Superstrings.

Oder führen Sie find / -type f -name iostream 2> /dev/null | grep include Oder locate iostream | grep include Aus (vorausgesetzt, die Datenbank ist aktuell, andernfalls wird ein Aufruf von updatedb vorangestellt) - diese drucken jedoch auch nicht systemweite Includes , bitte entsprechend einstellen. Der eigentliche C++ - Include-Pfad ist leicht zu finden mit:

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

Entsprechend auf Windows und anderen Computern. Ich denke, die Idee ist klar - eine Datei wie iostream.h Existiert standardmäßig nicht mehr im System-Include-Pfad, Sie können jedoch auch ältere libc ++ - Distributionen mit iostream.h Finden Softlink zu iostream oder als Kopie. Das ist also keine Frage des Stils, sondern der Umstände. Sie können Ihr eigenes iostream.h Mit Ihrem Projekt versenden. Stellen Sie nur sicher, dass es im Include-Pfad enthalten ist, in dem Ihr Compiler nach den <...> - Headern sucht.

1
Nicholas