C++ namespace

Supposons qu'il existe une situation où il y a deux étudiants nommés Zara dans une classe. Pour les distinguer clairement, outre l'utilisation de leurs noms, nous devons utiliser des informations supplémentaires, telles que leurs adresses personnelles, ou les noms de leurs parents, etc.

La même situation se produit également dans les applications C++. Par exemple, vous pourriez écrire une fonction nommée xyz(), et la même fonction xyz() existe également dans une autre bibliothèque disponible. De cette façon, le compilateur ne peut pas déterminer quelle fonction xyz() vous utilisez.

Par conséquent, il introduitnamespaceCe concept est spécifiquement utilisé pour résoudre le problème ci-dessus. Il peut servir d'information supplémentaire pour distinguer des fonctions, des classes, des variables, etc. portant le même nom dans différentes bibliothèques. Utiliser un espace de noms définit un contexte. Essentiellement, un espace de noms définit une portée.

Prenons un exemple tiré d'un système informatique : un dossier (répertoire) peut contenir plusieurs dossiers. Dans chaque dossier, les noms de fichiers ne peuvent pas être identiques, mais des fichiers dans différents dossiers peuvent porter le même nom.

Définir un espace de noms

La définition d'un espace de noms utilise le mot-clénamespace, suivi du nom de l'espace de noms, comme montré ci-dessous :

namespace namespace_name { // Déclaration de code }

Pour appeler une fonction ou une variable avec un espace de noms, vous devez la faire précéder du nom de l'espace de noms, comme montré ci-dessous :

name::code; // code peut être une variable ou une fonction

Regardons comment un espace de noms définit une portée pour des entités telles que des variables ou des fonctions :

Exemple

#include <iostream> using namespace std; // premier espace de noms namespace first_space{ void func(){ cout << "Inside first_space" << endl; } } // second espace de noms namespace second_space{ void func(){ cout << "Inside second_space" << endl; } } int main () { // appeler la fonction dans le premier espace de noms first_space::func(); // appeler la fonction dans le second espace de noms second_space::func(); return 0; }

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant :

Inside first_space
Inside second_space

directive using

Vous pouvez utiliser la directiveusing namespace, de sorte que lorsque vous utilisez l'espace de noms, vous n'avez pas besoin de faire précéder le nom de l'espace de noms. Cette directive indique au compilateur que le code suivant utilisera les noms de l'espace de noms spécifié.

Exemple

#include <iostream> using namespace std; // premier espace de noms namespace first_space{ void func(){ cout << "Inside first_space" << endl; } } // second espace de noms namespace second_space{ void func(){ cout << "Inside second_space" << endl; } } using namespace first_space; int main () { // appeler la fonction dans le premier espace de noms func(); return 0; }

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant :

Inside first_space

La directive using peut également être utilisée pour spécifier des éléments précis dans un espace de noms. Par exemple, si vous ne souhaitez utiliser que la partie cout de l'espace de noms std, vous pouvez utiliser une instruction comme celle-ci :

using std::cout;

Dans le code suivant, lors de l'utilisation de cout, vous n'avez pas besoin de le préfixer avec le nom de l'espace de noms, maisstdles autres éléments de l'espace de noms doivent encore être préfixés avec le nom de l'espace de noms, comme indiqué ci-dessous :

Exemple

#include <iostream> using std::cout; int main () { cout << "std::endl est utilisé avec std !" << std::endl; return 0; }

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant :

std::endl is used with std!

usingLes noms introduits par la directive suivent les règles de portée normales. Les noms sont visibles depuis l'utilisation de lausingdirective jusqu'à la fin de cette portée. À ce stade, les entités portant le même nom définies en dehors de la portée sont masquées.

Espaces de noms discontinus

Un espace de noms peut être défini en plusieurs parties différentes, donc un espace de noms est composé de plusieurs parties définies séparément. Les différentes composantes d'un espace de noms peuvent être dispersées sur plusieurs fichiers.

Par conséquent, si un composant d'un espace de noms doit demander un nom défini dans un autre fichier, il doit quand même déclarer ce nom. La définition d'espace de noms suivante peut définir un nouvel espace de noms ou ajouter de nouveaux éléments à un espace de noms existant :

namespace namespace_name { // Déclaration de code }

Espaces de noms imbriqués

Les espaces de noms peuvent être imbriqués. Vous pouvez définir un autre espace de noms à l'intérieur d'un espace de noms, comme indiqué ci-dessous :

namespace namespace_name1 { // Déclaration de code namespace namespace_name2 { // Déclaration de code } }

Vous pouvez utiliser::operator pour accéder aux membres d'un espace de noms imbriqué :

// accéder aux membres dans namespace_name2 using namespace namespace_name1::namespace_name2; // accéder aux membres dans namespace_name1 using namespace namespace_name1;

Dans l'instruction ci-dessus, si namespace_name1 est utilisé, alors les éléments de namespace_name2 dans cette portée sont également disponibles, comme montré ci-dessous :

Exemple

#include <iostream> using namespace std; // premier espace de noms namespace first_space{ void func(){ cout << "Inside first_space" << endl; } // second espace de noms namespace second_space{ void func(){ cout << "Inside second_space" << endl; } } } using namespace first_space::second_space; int main () { // appeler la fonction dans le second espace de noms func(); return 0; }

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant :

Inside second_space
autres extensions