web-dev-qa-db-fra.com

<iostream> vs. <iostream.h> vs. "iostream.h"

Lorsque vous incluez un fichier d'en-tête en C++, quelle est la différence entre ...

1) incluant le .h et non le .h lorsqu’il est entouré de <> signes?

#include <iostream> vs. #include <iostream.h>

2) placer le nom de l'en-tête entre guillemets et l'envelopper entre <> signes?

#include <iostream.h> vs. #include "iostream.h"

Merci d'avance!

31
BeachRunnerFred

En bref:

iostream.h est obsolète - il s'agit de la version d'origine de Stroustrup et iostream est la version du comité des normes. Généralement, les compilateurs indiquent la même chose, mais certains compilateurs plus anciens n'auront pas l'ancien. Dans certains cas étranges, ils existeront et seront différents (pour prendre en charge le code hérité) et vous devrez alors être spécifique.

"" versus <> signifie simplement vérifier l’en-tête des répertoires locaux avant d’aller dans la bibliothèque (dans la plupart des compilateurs).

-Adam

48
Adam Davis

Voici un lien décent article.

Pour résumer, la raison donnée:

La version de la bibliothèque iostream produite par le comité de normalisation était assez différente de celle de CFront. {couper}

Pour faciliter la transition, le Comité des normes C++ a déclaré que le code, y compris les en-têtes C++ standard, utiliserait des directives d'inclusion sans extension. Cela a permis aux fournisseurs de compilateur d'expédier les anciens en-têtes de bibliothèque de style C++ avec l'extension .h et les nouveaux en-têtes de style sans.

Un avantage de ne pas utiliser la version .h:

Il existe plusieurs raisons pour lesquelles le nouveau code doit être écrit à l'aide de la version sans extension des fichiers d'en-tête au lieu des formulaires .h. Le premier est l'imprévisibilité d'un tel code lorsqu'il est compilé sur des compilateurs modernes. Comme mentionné précédemment, l'utilisation des en-têtes .h a pour résultat une implémentation spécifique. Et avec le temps, la probabilité qu’un compilateur ait l’ancienne bibliothèque de styles disponible diminue.

7
Zee JollyRoger

En tant que membre du comité de normalisation (X3J16) qui a proposé d’abandonner le fichier .h, mon intention initiale était de régler le débat sur les extensions de fichier .h, .Hpp, .hpp, .hxx ou .h ++; ou le souhait de certains qu'il n'y ait aucune implication dans la norme qu'il s'agisse du nom d'un fichier sur disque afin de permettre à un IDE d'extraire des informations d'en-tête précompilées de quelque part interne comme un fichier de ressources ou même les entrailles du compilateur.

Alors qu'Unix considérait le nom de fichier comme une chaîne unique et ne reconnaissait pas réellement le concept d'extension, les systèmes d'exploitation DEC avaient l'habitude de séparer le nom de l'extension et de fournir "l'extension par défaut" s'il était omis dans des contextes particuliers. C’est là que j’ai eu l’idée de laisser l’implémentation utiliser l’extension souhaitée, ce qui a permis à l’implémentation de ne même pas enregistrer ce fichier sur un disque. (J'étais le représentant de DEC au comité à l'époque.)

La distinction entre les en-têtes standard et pré-standard constituait un avantage supplémentaire.

5
Aron Insinga

La méthode standard (et la seule garantie de fonctionner) est <iostream>. Sur gcc, <iostream.h> (qui doit éventuellement être inclus en tant que <backward/iostream.h>) extrait les déclarations pertinentes dans l'espace de noms global (vous n'avez donc pas besoin du préfixe std :: namespace).

"iostream.h" essaiera d’abord du répertoire avec votre code source, car "" est destiné aux en-têtes de votre projet. <> doit toujours être utilisé pour les en-têtes système et "" pour vos propres en-têtes.

2
CesarB

Ce sont vraiment deux questions différentes.

  • La différence entre les en-têtes .h et sans extension portant le même nom est historique. Ceux avec l'extension .h sont issus de la norme C++ d'origine qui ne comportait pas certaines fonctionnalités modernes telles que les espaces de noms et les modèles. Il était plus simple pour la nouvelle norme de placer cette même fonctionnalité dans de nouveaux fichiers d'en-tête afin de pouvoir utiliser ces nouvelles fonctionnalités et de conserver les anciens fichiers (.h) afin de permettre la compatibilité avec les versions antérieures du code hérité.

  • La différence entre les formats #include <...> et #include "..." correspond à l'ordre dans lequel le compilateur recherche les fichiers. Cela dépend généralement de la mise en œuvre, mais l’idée est que le format <> recherche d’abord dans les répertoires d’inclusion système, tandis que "" se trouve dans le même répertoire que le fichier source qui l’a inclus en premier.

1
Ferruccio

En général, <> est utilisé pour les fichiers de bibliothèque système ou standard, alors que "" est utilisé pour les fichiers de projet. Je ne serais pas surpris si votre compilateur effectue des recherches localement et s’il ne parvient pas à le trouver, il utilise par défaut la version standard de la bibliothèque.

En ce qui concerne le .h, je ne pense pas que ce soit vraiment important si vous utilisez C. En C++, je me souviens vaguement qu'il y avait une version plus récente et une version plus ancienne et que sans le h, elle était supposée être la nouvelle version, mais je ne suis même pas sûr que l'ancienne version existe toujours.

1
Uri

La réponse simple à la première réponse est que iostream.h n’existe pas, du moins dans l’implémentation de GCC. Si vous êtes sur * nix, tapez

% localiser iostream.h
/usr/include/c ++/3.4.3/backward/iostream.h

et

% localiser iostream
/usr/include/c ++/3.4.3/iostream
/usr/include/c ++/3.4.3/backward/iostream.h

Comme le dit l'article de Zee, iostream.h est destiné à la compatibilité ascendante.

0
yogman

En ce qui concerne les noms des fichiers d’en-tête C++ standard, au début (deux premières années) de X3J16, nous nous sommes heurtés à un argument sur la question de savoir quelle devrait être l’extension des fichiers d’en-tête C++ standard. Utilisé à l'époque par différents fournisseurs (et influencé par les contraintes imposées par certains systèmes d'exploitation sur les noms de fichiers), je crois qu'il y avait .h, .H, .h ++, .hpp, .HXX et peut-être d'autres. Lors d'une réunion de groupe de bibliothèques, j'ai suggéré de laisser l'extension désactivée et de laisser à l'implémentation le soin de fournir une extension de fichier par défaut de son choix s'il n'y en avait aucune dans la ligne d'inclusion, ou d'utiliser le nom comme clé dans une base de données de fichiers d'en-tête pré-compilés si vous le souhaitez. [Bien que les systèmes de type Unix traitent le nom de fichier et "extension" comme une seule chaîne, je représentais DEC au comité et de nombreux systèmes d'exploitation DEC stockaient l'extension dans le répertoire sous la forme d'un champ distinct du nom. Les systèmes d’exploitation de DEC ont donc traditionnellement appliqué une extension par défaut en fonction du programme qui accédait au fichier et dans quel but. Dire à un assembleur 'X, Y = Z' peut entraîner la lecture du fichier d'entrée Z.MAC (macro) et l'écriture des fichiers de sortie X.OBJ et Y.LST.] Quoi qu'il en soit, cela évitait un long débat sans issue, ainsi le groupe Andy Koenig a présenté les conclusions du groupe à ce sujet (parmi d’autres) à l’ensemble du comité qui l’a accepté. Je trouve quelque peu amusant que les implémentations aient manqué l’idée de pouvoir appliquer une extension par défaut de leur choix (ce qui, à mon avis, serait utile aux éditeurs et à d’autres outils) et qu’elles ont simplement laissé l’extension du nom de fichier.

0
Aron Insinga