web-dev-qa-db-fra.com

Différence entre iostream et iostream.h

Quelle est la différence entre iostream et iostream.h?

41
ckv

iostream.h est déconseillé par les compilateurs qui le fournissent, iostream fait partie de la norme C++.

Pour clarifier explicitement, il n'est pas fait mention de iostream.h du tout dans la norme C++ actuelle (INCITS ISO IEC 14882 2003).

Edit: Comme @Jerry l'a mentionné, non seulement le standard actuel ne le mentionne pas, mais aucun standard pour C++ ne le mentionne.

44
Brian R. Bondy

iostream est un en-tête standard. iostream.h est un en-tête non standard qui était très courant en C++ pré-standard, et c'est de cela qu'iostream a évolué. Il est toujours courant d'avoir iostream.h autour, probablement pour une utilisation avec des programmes plus anciens.

Si votre implémentation a une copie de travail de iostream.h, c'est probablement la même chose que iostream sauf que tout dans iostream se trouve dans l'espace de noms std, tandis que iostream.h précédait généralement les espaces de noms et ne les utilisait pas.

Si votre implémentation a à la fois iostream et iostream.h, iostream est susceptible de fonctionner comme:

namespace std
{
#include <iostream.h>
}

bien que ce ne soit pas nécessairement comme ça.

14
David Thornley

Lorsque C++ a été créé pour la première fois, tous les fichiers de la bibliothèque d'exécution standard se terminaient par .h. La vie était cohérente et c'était bien. La version originale de cout et cin vivait dans iostream.h. Lorsque le langage a été normalisé par le comité ANSI, ils ont décidé de déplacer toutes les fonctions de la bibliothèque d'exécution dans l'espace de noms std (ce qui est généralement une bonne idée). Cependant, cela posait un problème: s'ils déplaçaient toutes les fonctions dans l'espace de noms std, aucun des anciens programmes ne fonctionnerait plus!

Pour essayer de contourner ce problème, tout en conservant la compatibilité descendante pour les anciens programmes, un nouvel ensemble de fichiers d'en-tête a été introduit qui utilise les mêmes noms mais sans l'extension .h. Ces nouveaux fichiers d'en-tête ont toutes leurs fonctionnalités à l'intérieur de l'espace de noms std. De cette façon, les anciens programmes qui incluent #include <iostream.h> n'a pas besoin d'être réécrit, et les programmes plus récents peuvent #include <iostream>.

Lorsque vous incluez un fichier d'en-tête de la bibliothèque standard, assurez-vous d'utiliser la version non .h si elle existe. Sinon, vous utiliserez une version obsolète de l'en-tête qui n'est plus prise en charge.

De plus, de nombreuses bibliothèques héritées de C qui étaient encore utiles en C++ ont reçu un préfixe c (par exemple stdlib.h est devenu cstdlib). La fonctionnalité de ces bibliothèques a également été déplacée dans l'espace de noms std pour éviter les collisions de noms.

Cependant, lorsque vous écrivez vos propres fichiers d'en-tête, vous devez tous leur donner une extension .h, car vous ne placerez pas votre code dans l'espace de noms std.

Règle: utilisez la version non .h d'une bibliothèque si elle existe et accédez à la fonctionnalité via l'espace de noms std. Si la version non .h n'existe pas ou si vous créez vos propres en-têtes, utilisez la version .h

Source: https://www.learncpp.com/cpp-tutorial/19-header-files/

8
Pushpak Sharma