Quelle est la relation entre iostream et l'espace de noms std?
Je suis actuellement en utilisant apprendre par Vous-même en C++ en 21 Jours, Deuxième Édition livre pour apprendre le C++, le long de avec Microsoft Visual C++ 2010 Express. À la fin du Chapitre 1, il y a un petit exercice sur l'écriture et la compilation le code suivant:
#include <iostream>
int main ()
{
cout << "Hello World!\n";
return 0;
}
Assez simple, non? Cependant, à ma grande surprise, le code ne compile pas, à cause de cette erreur:
error C2065: 'cout' : identificateur non déclaré
J'ai commencé à récurer le Web, et bientôt trouvé quelques solutions ici. S'avère que j'avais à ajouter
using namespace std;
de mon code!
Cependant il n'y avait aucune mention des espaces de noms dans le livre, alors j'ai pensé que le livre est obsolète. (Il utilise #include <iostream.h>
pré-processeur de la directive!) Après quelques recherches sur le Web, j'ai trouvé beaucoup d'informations sur les espaces de noms, namespace std
, avec un certain historique sur <iostream.h>
et <iostream>
, et tout ce flux de nouvelles informations est assez confus pour moi. (Sans parler de tous les inutiles résultats de Google sur les Mst...)
Voici donc quelques questions que j'ai eu jusqu'à présent:
- Si je suis y compris la
iostream
bibliothèque, pourquoi unenamespace
besoin de trouvercout
? Est-il une autrecout
quelque part qui pourrait provoquer un conflit de nom? Si quelqu'un pouvait fournir un schéma pour cela, ce serait sympa.
Et en bonus, quelques arrière-plan historique:
-
Quel était exactement
iostream.h
avant il a été changé pouriostream
? -
Ne
namespace
jouer un rôle dans ce changement?
- Vous n'avez pas à ajouter
using namespace std;
à votre code. Que vous aviez à direstd::cout
, ouusing std::cout;
à l'intérieur demain
. - Mais pourquoi le
std
partie même nécessaire? Il y a plusieurscout
s à l'intérieur deiostream
? - Parce que
cout
est à l'intérieur de lastd
espace de noms.
Vous devez vous connecter pour publier un commentaire.
L'ensemble de la bibliothèque standard définitions sont à l'intérieur de l'espace de noms std. C'est qu'ils ne sont pas définies de manière globale, dans le but de les utiliser, vous devez vous qualifier dans un de la manière suivante:
std::cout
using namespace std
using std::cout
Par exemple, vous permet de profiter de cette:
global_variable
peut être d'accès tel qu'il est:Mais variable2 ne fait pas partie de l'espace mondial, mais une partie de la
namespace n
.Donc vous devez utiliser le nom complet:
Comme un raccourci, vous pouvez écrire:
ou
Comme pour les fichiers d'en-tête,
iostream.h
a été utilisé par de nombreux compilateurs avant il y avait un standard. Lorsque le comité a essayé de normaliser ils ont décidé de faire du C++ en-têtes extensionless afin de ne pas casser la compatibilité avec le code existant.Parce que cette ligne commence avec
#
, il est appelé une "directive de préprocesseur". Le préprocesseurlit de votre programme avant de elle est compilée et exécutée uniquement ceux commençant par les lignes
#
. Le préprocesseur permet de configurer votre code source du compilateur.La
#include
directive provoque le préprocesseur d'inclure le contenu d'un autre fichier dans le programme. Leiostream
fichier contient un code qui permet à un programme C++ pour la sortie d'affichage à l'écran et de prendre d'entrée à partir du clavier. Leiostream
fichiers sont inclus dans le programme au moment de la#include
directive s'affiche. Leiostream
est appelé un fichier d'en-tête et apparaît au haut ou le responsable du programme.using namespace std;
C++ utilise des espaces de noms pour organiser les noms de programme ou des entités. Il déclare que le programme sera évaluation des entités qui font partie de la
namespace
appelé "std." Chaque nom créé par leiostream
fichier est une partie de cettenamespace
.Il est nécessaire parce que la norme C++ exige que
cout
être à l'intérieur de lastd
espace de noms. Il y pourrait être un cliquetiscout
, mais pas dans la bibliothèque standard (par exemple, votre propre code, ou une tierce partie de la bibliothèque.)Il pourrait être n'importe quoi, parce qu'il ne fait pas partie de la norme, mais c'était le nom d'un pré-normalisation-tête qui a formé la base pour
iostream
. Habituellement, il a déclaré que tous les noms dans l'espace de noms global, il est donc probable que l'exemple que vous cherchez à a été écrit avant la normalisation.2.Ne
namespace
jouer un rôle dans ce changement?Cette question n'est pas claire. Le mot-clé
namespace
peut être utilisé à l'intérieur d'implémentations, et il est utilisé pour déclarer et définir les données, fonctions, types, etc. à l'intérieur d'un espace de noms. Donc il n'ont certains part à ce changement.En C++, vous pouvez logiquement des identificateurs de groupe dans les espaces de noms.
cout
flux est à l'intérieur de l'espace de noms std. Vous pouvez l'utiliser de 3 façons.using namespace std
au dessus et utilisercout
comme vous l'avez fait.using std::cout
au dessus et utilisercout
comme vous l'avez fait.std::cout
au lieu decout
J'ai eu la même question que vous. Je vais vous apprendre en termes profanes.
Imaginez que vous avez besoin d'un crayon, qui est placé dans un tiroir qui est présent dans votre chambre à coucher. Si vous avez besoin d'entrer dans votre chambre pour accéder à votre crayon. Ici, la salle est iostream. Dès que vous entrez dans votre chambre, vous devez ouvrir le tiroir et l'accès au crayon. Ici tiroir est espace de noms et crayon est cin/cout.
De référence:- https://en.wikiversity.org/wiki/C%2B%2B/Introduction