web-dev-qa-db-fra.com

Pourquoi #include <iostream.h> est-il mauvais?

Je lisais n autre fil où un gars a posé des questions sur les livres C++ pour les débutants, et l'un des programmeurs répondant a écrit ceci:

Quelques avertissements: évitez tous les livres qui présentent un "bonjour le monde"

#include <iostream.h>

J'ai ouvert mon livre C++ et bien sûr, il comprenait l'en-tête iostream comme l'exemple ci-dessus.

Pourquoi est-ce mauvais? Quels autres pointeurs dois-je garder à l'esprit lors de l'apprentissage du C++?

Contexte: Je maîtrise le C et je vais commencer à apprendre le C++ ce semestre prochain.

48
Daniel Scocco

L'en-tête iostream.h est un en-tête non standard et n'existe pas sur toutes les plateformes. En fait, il n'existe pas sur mon système (en utilisant g ++ et le GNU libstdc ++). Donc tout code l'utilisant ne compilerait tout simplement pas sur mon système.

Le iostream.h l'en-tête était commun avant la première normalisation de C++ en 1998. Mais puisque la norme 98 utilisait <iostream> au lieu de <iostream.h>, ce dernier est tombé en disgrâce (étant non standard et tout) et n'est plus pris en charge sur toutes les plates-formes. Le code qui l'utilise doit être considéré comme un code hérité non standard et n'est pas portable. Les livres qui l'enseignent doivent être considérés comme dépassés et évités.

58
sepp2k

#include <iostream.h> est un signe que le livre a été écrit avant la première norme C++ en 1998 (l'en-tête standard est iostream).

Le problème est que le code C++ plus ancien a tendance à être écrit d'une manière qui est considérée comme une mauvaise pratique aujourd'hui. En particulier,

  • L'utilisation de tableaux de style C plutôt que de classes de conteneurs comme std::string et std::vector.
  • L'utilisation de fonctions close explicites plutôt que RAII.

iostream.h n'est pas la chose pire qu'un livre d'avant 1998 se trompera, mais c'est probablement la première chose qu'un livre d'avant 1998 se trompera.

56
dan04

Peut-être que cela arrive un peu tard, mais pour ce que ça vaut, sur une boîte unix/linux, faites ls /usr/{local/,}include/c++/* ou similaire, selon votre disposition et vos chemins d'accès. Vous pouvez diriger vers grep en recherchant l'en-tête en question, comme:

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

Cela implique une recherche de iostream.h ainsi que toutes les autres supercordes.

Ou exécutez find / -type f -name iostream 2> /dev/null | grep include ou locate iostream | grep include (à condition que la base de données soit à jour, sinon préfixez avec un appel à updatedb) - ceux-ci, cependant, imprimeront également les inclusions non à l'échelle du système, veuillez donc ajuster en conséquence. Le chemin d'inclusion C++ réel est facilement trouvé avec quelque chose comme:

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

De manière équivalente sur Windows et autres machines. Je suppose que l'idée est claire - un fichier tel que iostream.h n'existe plus dans le chemin d'inclusion système par défaut, mais vous pouvez toujours trouver les distributions libc ++ héritées avec iostream.h soit un lien logiciel vers iostream ou sa copie. Ce n'est donc pas une question de style mais plutôt de circonstances. Vous pouvez expédier votre propre iostream.h avec votre projet assurez-vous qu'il est contenu dans le chemin d'inclusion où votre compilateur recherche le <...> en-têtes.

1
Nicholas