9
votes

Inclure et utiliser l'espace de noms en C ++

pour utiliser COUT code>, j'ai besoin de spécifier les deux:

using namespace std;


4 commentaires

@Neil alors quel est le but de si? Ne poser que des questions qui n'ont aucun moyen de répondre en lisant un livre ou en recherchant sur Internet?


@Neil Butterworth: D'accord! Pas plus de questions stupides après celui-ci, sans lire les concepts d'un livre.


@Kevin quiconque qui pense qu'ils peuvent apprendre c ++ en posant des questions sur telle-même se trompent et en gaspillant notre temps.


Je pense que la question est appropriée pour. Cela n'était donc pas destiné à être réservé uniquement à des questions obscures / avancées.


4 Réponses :


9
votes

iostream code> est le nom du fichier dans lequel Cout est défini. D'autre part, std code> est un espace de noms, équivalent (dans un sens) au package de Java.

Cout est une instance définie dans le fichier iostream code>, à l'intérieur du std Espace de noms. p>

Il pourrait exister un autre COUT code>, dans un autre espace de noms. Donc, pour indiquer que vous souhaitez utiliser l'instance code> code> à partir de l'espace de noms code> std code>, vous devez écrire p>

std :: COUT code >, indiquant la portée. p> xxx pré>

pour éviter le std :: code> partout, vous pouvez utiliser le à l'aide de la clause code>. P>

namespace std{
   ostream cout;
}
namespace other{
   float cout;//instance of another type.
}


2 commentaires

@TOM: Quand j'ai déjà inclus le fichier ( iostream ), j'ai spécifié la définition de cout à utiliser. Maintenant, le compilateur sait quelle définition à utiliser. Alors, quel est le problème alors. Je suis toujours confondu de la raison pour laquelle j'ai besoin de dire que c'est dans std Espace de noms. Cela aurait dû être nécessaire s'il y avait une certaine confusion. Ici, il n'y a pas de confusion car il n'y a qu'une seule définition de Cout .


@CAMBR: Non, vous avez spécifié une définition de COUT à utiliser. Il n'y a aucune raison pour ne pas définir int Cout; après, bien que ce ne soit pas une bonne idée. Sans doute, la norme C ++ aurait pu être ignorée que les espaces de noms soient ignorés s'il n'y a qu'un espace de noms avec un symbole donné, mais ce n'est pas le cas, et je ne peux pas penser à une langue à l'aide d'espaces de noms où il fait.



1
votes

cout est défini logiquement dans iostream. Par logiquement, je veux dire que cela peut réellement être dans le fichier iOSTREAM ou que cela peut être dans certains fichiers inclus dans iostream. De toute façon, y compris iostream est la bonne façon d'obtenir la définition de COUT .

Tous les symboles de iostream sont dans l'espace de noms std . Pour utiliser le symbole Cout , vous devez dire au compilateur comment le trouver (c'est-à-dire quel espace de noms). Vous avez quelques choix: xxx


0 commentaires

1
votes

Le #include Références Le fichier d'en-tête qui définit COUT. Si vous allez utiliser COUT, vous aurez toujours besoin de l'inclusion.

Vous n'avez pas besoin de à l'aide de NAMESPACE STD; . Cela vous permet simplement d'utiliser le sténographie COUT et endl et similaire, plutôt que std :: cou et std :: endl où l'espace de noms est explicite. Personnellement, je préfère ne pas utiliser à l'aide de l'espace de noms ... car cela nécessite que je sois explicite à mon sens, bien que cela soit certes plus verbeux.


1 commentaires

Le compromis est en utilisant std :: cout; Utilisation de std :: endl; , après quoi vous pouvez utiliser COUT et endl sans qualification, sans apporter l'espace de noms std dans l'espace de noms global.



2
votes

Si votre implémentation C ++ utilise des fichiers d'en-tête de style C (beaucoup de), un fichier contient quelque chose de similaire à: xxx p> std est l'espace de noms que la norme C ++ dit la plupart des Les choses standard devraient résider. Cela consiste à empêcher de surpopuler l'espace de noms global, ce qui pourrait vous empêcher de faire des problèmes de noms pour vos propres cours, variables et fonctions qui ne sont pas déjà utilisées comme noms pour des choses standard.

En disant xxx

Vous indiquez au compilateur que vous souhaitez que vous recherchiez dans l'espace de noms Std en plus de l'espace de noms global lors de la recherche de noms. Si le compilateur voit la ligne source: xxx

quelque part après le à l'aide de namepace std; ligne, il recherchera foo Dans divers espaces de noms différents (semblables aux champs) jusqu'à ce qu'il trouve une FOO qui répond aux exigences de cette ligne. Il recherche des espaces de noms dans un certain ordre. D'abord, il ressemble à la portée locale (qui est vraiment un espace de noms non nommé), puis la prochaine portée locale jusqu'à fin et plus jusqu'à l'extérieur d'une fonction, puis sur les choses nommées par l'objet enfermantes (méthodes, dans ce cas), puis à Noms globaux (fonctions, dans ce cas, sauf si vous ignorez et surchargé () que j'ignore), puis à l'espace de noms STD si vous avez utilisé le à l'aide de NAMESPACE STD; LIGNE. Je peux avoir les deux derniers dans le mauvais ordre (STD peut être recherché avant que Global), mais vous devriez éviter d'écrire du code qui dépend de cela.


0 commentaires