pourquoi dois-je inclure le fichier d'en-tête <iostream> après l'utilisation de l'espace de noms std?
Depuis l'espace de noms std a déjà le c++ bibliothèques qui contiennent la définition d'une fonction(si je suis à droite), alors pourquoi avons-nous inclure les fichiers d'en-tête au-dessus??. Depuis l'espace de noms std comprend la norme c++ bibliothèques, je ne vois pas une raison pour inclure les déclarations séparément.
Pas TOUT à fait sûr si vous posez la question "pourquoi avons-nous besoin de deux espaces de noms et les fichiers d'en-tête", ou "pourquoi il fait une différence entre l'ordre de
Vous ne devriez jamais inclure
en disant que vous êtes en utilisant un espace de noms est en aucune façon la même chose que de dire que vous avez accès à toutes les classes incluses dans cet espace de noms. Donc, essentiellement, vous vous demandez pourquoi, vous devez inclure les fichiers d'en-tête pour l'accès aux classes qui sont déclarées?
Dans Unix, vous n'avez probablement pas un
#include <iostream>
et using namespace std;
?Vous ne devriez jamais inclure
iostream.h
à moins que les exigences de votre programme incluent le travail sur le DOS.en disant que vous êtes en utilisant un espace de noms est en aucune façon la même chose que de dire que vous avez accès à toutes les classes incluses dans cet espace de noms. Donc, essentiellement, vous vous demandez pourquoi, vous devez inclure les fichiers d'en-tête pour l'accès aux classes qui sont déclarées?
iostream.h
fait un peu bizarre. La norme actuelle fait référence à #include <iostream>
en fait.Dans Unix, vous n'avez probablement pas un
iostream.h
- noter la distinction entre iostream
et iostream.h
.OriginalL'auteur Manoj Bharadwaj | 2014-09-28
Vous devez vous connecter pour publier un commentaire.
Lorsque vous ne
#include <iostream>
il entraîne un ensemble de classes et d'autres choses pour être inclus dans votre fichier source. Pour iostream, et la plupart de la bibliothèque standard, en-têtes, ils placent ces choses dans un espace de noms nomméstd
.Donc le code pour
#include <iostream>
ressemble à quelque chose comme ceci:Donc, à ce stade, vous pourriez écrire un programme qui ressemble à:
Maintenant, certaines personnes pensent que
std::cout
est trop verbeux. Donc, ils n':Personnellement, je vous recommande contre, et si vous vous sentez vraiment que
std::cout
est trop verbeux, alors je vous suggère d'utiliser un plus petitusing
déclaration.Si vous vous demandez pourquoi je déconseille
using namespace std
, alors je voudrais passer à la suite, deux autres postes sur stackoverflow:Pas de. Beaucoup de différents fichiers d'en-tête sera de placer des choses dans cet espace de noms. Le
using
de commande n'est pas implicitement savoir quel en-tête de qui est.mais il est à seulement 1 objet de ce nom à l'intérieur d'un seul espace de noms, n'est-ce pas suffisant?
Mais comment le compilateur de savoir ce que
cin
est ou? Qui vient du contenu de iostream. Le compilateur lui-même ne sait pas ce que ce fichier contient, ou quecin
vient deiostream
. Cela fait partie de la bibliothèque d'exécution, pas le compilateur lui-même, de sorte qu'il doit être COMPILÉ par le compilateur pour votre programme pour pouvoir l'utiliser.OriginalL'auteur Bill Lynch
Le compilateur lui-même n'a pas les définitions des choses qui sont dans tout espace de nom (s'il est
std
ou de quelque autre espace de noms). C'est le rôle de fichiers source et les fichiers d'en-tête.Ce
using namespace std;
indique au compilateur que "Si vous ne pouvez pas trouver un certain nom dans l'espace de noms courant, aller chercher dans lesstd
espace".Ce
#include <iostream>
indique au compilateur que vous voulez que le contenu de l'en-tête appeléiostream
être inclus dans votre sources. Cela permettra de fournir le compilateur avec le code pour le fairecin
,cout
et beaucoup d'autres fonctionnalités. Le contenu de ce fichier est déclaré commenamespace std { ... all the stuff goes here ... }
.L'utilisation de l'espace de noms permet à quelqu'un d'autre, travaillant dans
namespace math;
de ne pas avoir à vous soucier de "Hmm, que dois-je faire maintenant, j'ai besoin d'un compteur de nombre d'entrées, nous allons l'appelercin
- mais attendez, est déjà utilisé n'importe où?".Cela peut ne pas être le plus grand des exemples, mais dans les grands projets, il devient de plus en plus difficile de garder une trace des choses et du nom qu'ils portent. Et le C++ est un langage destiné pour les grands projets de millions de lignes de code, et maintenant ça commence à devenir dur de s'en souvenir si vous avez utilisé un nom ou pas. Les espaces de noms assurez-vous que vous n'avez pas à vous soucier de l'extérieur d'un espace de noms.
(Oh, et dans mon code, j'ai tendance à ne pas utiliser
using namespace std;
, mais écrirestd::cout << "Hello, World!" << std::endl;
- ce qui contribue à le rendre clair que lacout
que j'utilise ici est lastd
, et pas autre chose. Ceci est particulièrement utile lorsque vous avez plusieurs espaces de noms avec des choses semblables, comme dans mon propre compilateur, où j'ai mon compilateur avec ses fonctionnalités, lestd
espace de noms de fournir certaines choses, etllvm
compilateur choses - si j'étais à collerusing namespace llvm;
au début du code, il serait très difficile à suivre, siType* p = ...
; est à partir de LLVM ou d'une partie de ma propre code.)OriginalL'auteur Mats Petersson
Oui, il y a un grand confusion ici.
Espaces de noms
Les espaces de noms sont une méthode pour classer ou d'un groupe ensemble, les symboles, tels que les noms de fonction.
Les espaces de noms sont de conception pour éviter les conflits de noms entre les différents composants logiciels, tels que les bibliothèques.
Fonctions qui font partie de la langue standard, sont regroupées sous l'espace de noms
std
.Le langage C++ fournit des déclarations de réduire la quantité de saisie lors de l'utilisation d'espaces de noms. L'un de ces est la
using
déclaration.En-tête (inclure) des Fichiers
Lorsque vous écrivez un programme, le compilateur n'est pas nécessaire d'inclure automatiquement les tous les définitions des symboles, en effet, de telles déclarations. Vous avez besoin de lui dire les fonctions auxquelles vous comptez utiliser.
Par exemple, je pourrais écrire un programme sans l'aide de la
sort
ouadvance
fonctions de laalgorithm
groupe. Donc je ne voudrais pas inclure le fichier d'en-têtealgorithm
.Le langage C++ a été conçu pour utiliser ce que vous avez besoin", en d'autres termes, nous pouvons créer des petits programmes en n'incluant que les fonctions dont nous avons besoin.
D'Autres Plates-Formes
Par le façon, il ya beaucoup d'autres plates-formes que celui que vous utilisez.
Certaines plates-formes doivent tenir dans de petites zones de mémoire et ne peut pas avoir un clavier ou un écran (tels que les contrôleurs embarqués).
Donc n'oubliez pas, C++ a été défini afin de soutenir les plates-formes à partir de la petite et limitée à la taille et pratiquement sans contrainte du système.
Ainsi, l'exigence d'inclure uniquement ce dont vous avez besoin".
Résumé
En résumé, depuis le C++ langues ne sont pas automatiquement, comme par magie, donner une définition de l'ensemble de la bibliothèque, y compris le modèle de la bibliothèque, vous devez indiquer au compilateur les groupes de fonctions que vous souhaitez utiliser. Cela permet d'établir plus rapidement des compilations puisque seules les fichiers d'en-tête sont spécifiés.
Note: Certains magasins de la bibliothèque de fournitures comme l'utilisation de la Monolithe inclure système. Cela signifie qu'ils ont l'un fichier include qui comprend la totalité de leur bibliothèque, si vous utilisez une fonction ou à plusieurs. Le
windows.h
est un exemple classique. Un dommage est que lorsqu'un fichier d'en-tête est changé, tout doit être reconstruit. Avec séparées inclure des fichiers, seuls les composants qui incluent le changement de fichier d'en-tête doivent être reconstruites.OriginalL'auteur Thomas Matthews
Utilisation de la directive de préprocesseur #include est vieux comme le c++. Et ce n'est pas s'en aller plus tôt.En C++ de l'espace de noms Ne rien importer dans votre programme, il ne définit la portée de votre fichier d'en-tête de la fonction.Oui, les deux sont nécessaires. Cliquez icide comprendre pourquoi l'utilisation de l'espace de noms.
OriginalL'auteur Sidharth