Espace de noms C++

C Namespace



Un espace de noms en C++ est une portée généralisée. Sa déclaration commence par le mot réservé, namespace, suivi d'un nom au choix du programmeur, puis du bloc entre accolades. Le bloc contient des déclarations de base et/ou des définitions d'objets, de fonctions et d'autres entités C++.

Considérez les deux instructions scalaires suivantes dans une portée globale, dans le programme suivant :







#comprendre
en utilisant l'espace de noms std;

entiervarId= 5;
flottervarId= 2.3;

entierprincipale()
{

revenir 0;
}

Une tentative de compilation de ce programme entraîne une erreur de compilation. Il y a deux variables avec le même nom, varId . Bien qu'il s'agisse de deux variables différentes de deux types différents, entier et flotter , le compilateur rejette les deux déclarations car elles portent le même nom. Le programme suivant résout ce problème en déclarant les variables du même nom dans deux portées généralisées différentes :



#comprendre
en utilisant l'espace de noms std;

espace de noms NA
{
entiervarId= 5;
}

espace de noms NB
{
flottervarId= 2.3;
}

entierprincipale()
{
cout<<N / A::varId << ' ';
cout<<NB::varId << ' ';

revenir 0;
}

La sortie est la suivante :



5
2.3

Il y a deux espaces de noms dans le programme ci-dessus : N / A , qui a la définition d'un entier, et NB , qui a la définition d'un flottant mais avec le même nom que l'entier pour NA. Enfin, lors de l'exécution du programme, le même nom pour deux variables différentes a été utilisé. Notez que pour accéder au même nom de deux variables différentes, le nom particulier de l'espace de noms doit être utilisé, suivi de l'identifiant commun. Le nom de l'espace de noms et l'identifiant commun sont séparés par l'opérateur de résolution de portée, :: . Le nom des espaces de noms différenciera les objets.





Cet article couvre le concept de base d'un espace de noms et son utilisation dans le langage de programmation C++. Pour suivre cet article, vous devez avoir une connaissance de base du langage C++. Vous devez également connaître la portée C++, bien qu'elle soit brièvement expliquée dans cet article. Pour en savoir plus sur la portée C++, recherchez l'expression Portée en C++ (sans les guillemets) dans la zone de recherche de n'importe quelle page Web linuxhint.com et appuyez sur Entrée. Cela vous mènera à l'article que cet auteur a écrit.

Contenu de l'article

Qu'est-ce qu'un espace de noms ?

Une région déclarative est la plus grande partie d'un programme dans laquelle le nom d'une entité (variable) est valide. Cette région s'appelle une étendue. Un espace de noms en C++ est une portée généralisée dont le but principal est de résoudre les conflits de noms. Un espace de noms a des déclarations de base et/ou des définitions d'entités.



Espace de noms global et son problème

L'espace de noms global est la portée globale. Considérez le programme court suivant :

#comprendre
en utilisant l'espace de noms std;

entieridentifiant= 55;
flotteridentifiant= 12.17;

entierprincipale()
{

revenir 0;
}

Dans le programme ci-dessus, il y a deux variables, toutes deux appelées identifiant . Ces variables sont dans la portée globale ; c'est-à-dire qu'ils sont dans l'espace de noms global. Une tentative de compilation de ce programme échouera avec un message d'erreur. La portée globale n'accepte pas plus d'une variable avec le même nom, il est donc nécessaire d'avoir un espace de noms personnalisé.

Espace de noms personnalisé

Un espace de noms n'a pas qu'un seul nom. Au lieu de cela, un espace de noms a un ensemble de noms pour éviter les conflits avec d'autres ensembles de noms. Pour éviter les conflits plus bas dans le code, faites précéder chaque nom du nom de l'espace de noms et :: . Le programme suivant illustre cela à l'aide de deux espaces de noms personnalisés :

#comprendre
en utilisant l'espace de noms std;

espace de noms NA
{
entiervarInt= 6;
flotterflt;
}

espace de noms NB
{
entiervarInt= 7;
flotterflt;
}

entierprincipale()
{
cout<<N / A::varInt << ' ';
cout<<NB::varInt << ' ';
N / A::flt = 2.5;
NB::flt = 4.8;
cout<<N / A::flt << ' ';
cout<<NB::flt << ' ';

revenir 0;
}

La sortie est :

6
7
2.5
4.8

Notez que les noms NA::flt et NB::flt ont finalement été définis dans le principale() fonction. C++ n'autorise pas une telle définition dans la portée globale.

Notez que l'espace de noms personnalisé est un espace de noms imbriqué pour l'espace de noms global.

La directive d'utilisation

Pour éviter de taper namespace::name tout le temps au lieu de simplement name après avoir déclaré l'espace de noms, vous pouvez utiliser le à l'aide de directif. La syntaxe pour utiliser le à l'aide de directive est la suivante :

en utilisant l'espace de noms Namespace_name;

Les à l'aide de La directive n'est pas une directive de préprocesseur, elle se termine donc par un point-virgule (;).

Le programme suivant illustre l'utilisation du à l'aide de directive et plus :

#comprendre
en utilisant l'espace de noms std;

espace de noms NB
{
entiervarInt= 7;
entierfonction()
{
revenirvarInt;
}
}

entierfn()
{
en utilisant l'espace de noms NB;
entiermaVar2=fonction();
//d'autres objets et fonctions de NB suivent.
revenirmaVar2;
}

entiermaVar3=NB::fonction();

entierprincipale()
{
cout<<fn() << '' <<maVar3<< ' ';

revenir 0;
}

La sortie de ce programme est 7 7 . Le terme en utilisant l'espace de noms NB ; a été placé au début de la fn() définition. Les fonction () de l'espace de noms NB est appelé juste en dessous, sans faire précéder de NB : : .

Une variable déclarée dans la portée globale (espace de noms global) est vue depuis le point de déclaration jusqu'à la fin du fichier. Il est également visible dans les espaces de noms imbriqués (portées imbriquées), tels que le fn() portée de la fonction ci-dessus. Les à l'aide de La directive joint son espace de noms de la position à laquelle elle est placée à la fin de la portée dans laquelle elle est placée.

Le nom fonction () de l'espace de noms NB n'est pas visible sous le fn() définition parce que en utilisant l'espace de noms NB ; a été placé dans la portée de la fonction (bloc). Dans cette condition, utiliser fonction () en dehors du bloc d'espace de noms NB (portée), il doit être précédé de NB : : , comme dans l'énoncé suivant :

entiermaVar3=NB::fonction();

Les à l'aide de La directive joint son espace de noms à l'espace de noms d'imbrication externe à partir de la position à laquelle elle est placée jusqu'à la fin de l'espace de noms d'imbrication externe. Dans le programme suivant, l'espace de noms NA est joint à l'espace de noms global. Les deux espaces de noms s'étendent ensuite dans le fn() espace de noms de définition de fonction, dans lequel ils sont joints à l'espace de noms NB. L'espace de noms NB se termine à la fin du fn() définition de fonction, et les deux espaces de noms précédents continuent jusqu'à la fin du fichier (lire le code).

#comprendre
en utilisant l'espace de noms std;

espace de noms NA
{
entiervarInt= 6;
entierfonction()
{
revenirvarInt;
}

}

espace de noms NB
{
entiervarInt= 7;
entierfonction()
{
revenirvarInt;
}
}

en utilisant l'espace de noms NA;
entiermaVar0=varInt;
//d'autres objets et fonctions de :: et NB suivent.

entierfn()
{
entiermaVar1=varInt;
en utilisant l'espace de noms NB;
entiermaVar2=NB::fonction();
//d'autres objets et fonctions de NB suivent, jusqu'à la fin de cette portée.
revenirmaVar1+maVar2;
}

//Seuls les objets et fonctions de :: et NB suivent.

entiermaVar3=NB::fonction();

entierprincipale()
{
cout<<maVar0<< '' <<fn() << '' <<maVar3<< ' ';

revenir 0;
}

La sortie est 6, 13, 7 .

Noter: L'espace de noms global est indiqué par :: , ce qui signifie qu'il n'y a rien avant l'opérateur de résolution de portée qui suit.

Au-dessous de la déclaration, le en utilisant l'espace de noms NA ; les variables des espaces de noms global et NA peuvent être utilisées sans indication de leur espace de noms source. L'instruction suivante utilise le varInt de l'espace de noms NA. La région des espaces de noms combinés global et NA s'étend dans le fn() espace de noms de fonction. Alors le varInt de la première déclaration dans le fn() portée de la fonction, est de l'espace de noms NA.

Étant donné que la région des espaces de noms global et NA s'étend sur tout le fn() portée, après la int maVar2 = NB::func(); , tout nom de l'espace de noms NB ne peut être utilisé que dans le fn() portée sans la faire précéder de NB : : , uniquement s'il ne s'est pas produit dans les espaces de noms NA et globaux (blocs). Sinon, il doit être précédé de NB : : . La région des espaces de noms combinés pour NA et global continue en dessous de la fn() définition et dans le principale() fonction jusqu'à la fin du fichier.

L'extension de l'espace de noms NB commence à partir de int maVar2 = NB::func(); dans le fn() bloc et se termine à la fin du fn() bloc de définition.

Noter: Les espaces de noms dont les régions sont jointes ne doivent pas avoir le même nom de variable dans leurs différents blocs d'espaces de noms, car cela provoquerait toujours un conflit.

Régions d'espace de noms

Un espace de noms est une étendue. En dehors de l'espace de noms global (portée globale), tout espace de noms doit être déclaré dans un bloc. Ce bloc est la première partie des régions éventuellement distribuées de l'espace de noms. Avec la directive using, l'espace de noms peut être étendu en tant que régions dans d'autres portées.

Les entités déclarées dans un corps d'espace de noms sont dites membres de l'espace de noms, et les noms introduits par ces déclarations dans la région déclarative de l'espace de noms sont dits membres de l'espace de noms.

Espaces de noms imbriqués

Le programme suivant affiche les espaces de noms imbriqués :

#comprendre
en utilisant l'espace de noms std;

espace de noms A
{
entierje= 1;
espace de noms B
{
entierje= 2;
espace de noms C
{
entierje= 3;
}
}
}

entierprincipale()
{
cout<<À::je << '' <<À::B::je << '' <<À::B::C::je << ' ';

revenir 0;
}

La sortie est :

1 2 3

Notez que les trois valeurs ont été accédées à l'aide de l'opérateur de résolution de portée.

Espace de noms standard

C++ a une bibliothèque appelée la bibliothèque standard. Les noms des objets, fonctions et autres entités de cette bibliothèque proviennent d'un espace de noms appelé espace de noms standard, écrit sous la forme les heures . La bibliothèque standard contient des sous-bibliothèques, et l'une de ces sous-bibliothèques est iostream . Les iostream la bibliothèque contient l'objet cout , qui est utilisé pour envoyer les résultats à la console (terminal).

Le nom cout doit être dans le les heures espace de noms. Utiliser iostream avec son les heures namespace, le programme doit être le suivant :

#comprendre
en utilisant l'espace de noms std;

Notez l'utilisation du à l'aide de directive et les heures . Le terme #comprendre est une directive de préprocesseur et ne se termine pas par un point-virgule. Il inclut le fichier iostream à la position de sa directive.

Conclusion

Un espace de noms est une étendue. La description (définition) de l'espace de noms contient des déclarations de base et/ou des définitions d'objets, de fonctions et d'autres entités C++. En dehors de la définition de l'espace de noms, le nom est accessible avec la syntaxe, namespaceName::name . En dehors de l'espace de noms global (portée globale), tout espace de noms doit être déclaré dans un bloc. Ce bloc est la première partie des régions éventuellement distribuées de l'espace de noms. Avec le à l'aide de directive, l'espace de noms peut être étendu en tant que régions dans d'autres portées. Les espaces de noms dont les régions sont jointes ne doivent pas avoir le même nom de variable dans leurs différents blocs d'espaces de noms, car cela provoquerait toujours un conflit de noms.

Chrys