Espace de noms C++


Supposons qu'il y ait deux élèves nommés Zara dans une classe. Afin de les distinguer clairement, en plus d'utiliser leurs noms, nous devons utiliser des informations supplémentaires, comme leur adresse familiale. , ou les noms de leurs parents, etc.

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

Par conséquent, le concept de espace de noms est introduit spécifiquement pour résoudre le problème ci-dessus. Il peut être utilisé comme information supplémentaire pour distinguer les fonctions, classes, variables, etc. portant le même nom dans différents. bibliothèques. L'utilisation d'un espace de noms définit un contexte. Essentiellement, un espace de noms définit une portée.

Définir un espace de noms

Un espace de noms est défini à l'aide du mot clé namespace, suivi du nom de l'espace de noms, comme suit :

namespace namespace_name {
   // 代码声明
}

Dans l'ordre pour appeler avec Les fonctions ou les variables avec un espace de noms doivent être précédées du nom de l'espace de noms, comme indiqué ci-dessous :

name::code;  // code 可以是变量或函数

Voyons comment les espaces de noms définissent les portées des entités telles que les variables ou les fonctions :

#include <iostream>
using namespace std;

// 第一个命名空间
namespace first_space{
   void func(){
      cout << "Inside first_space" << endl;
   }
}
// 第二个命名空间
namespace second_space{
   void func(){
      cout << "Inside second_space" << endl;
   }
}
int main ()
{
 
   // 调用第一个命名空间中的函数
   first_space::func();
   
   // 调用第二个命名空间中的函数
   second_space::func(); 

   return 0;
}

Lorsque le code ci-dessus est compilé et exécuté, il produira les résultats suivants :

Inside first_space
Inside second_space

using directive

Vous pouvez utiliser la directive using namespace, de sorte que lors de l'utilisation d'un espace de noms, vous n'avez pas besoin d'ajouter le nom de l'espace de noms devant. Cette directive indique au compilateur que le code suivant utilisera des noms dans l'espace de noms spécifié.

#include <iostream>
using namespace std;

// 第一个命名空间
namespace first_space{
   void func(){
      cout << "Inside first_space" << endl;
   }
}
// 第二个命名空间
namespace second_space{
   void func(){
      cout << "Inside second_space" << endl;
   }
}
using namespace first_space;
int main ()
{
 
   // 调用第一个命名空间中的函数
   func();
   
   return 0;
}

Lorsque le code ci-dessus est compilé et exécuté, il produit les résultats suivants :

Inside first_space

La directive using peut également être utilisée pour spécifier des éléments spécifiques dans un espace de noms. Par exemple, si vous envisagez d'utiliser uniquement la partie cout de l'espace de noms std, vous pouvez utiliser l'instruction suivante :

using std::cout;

Dans le code suivant, vous n'avez pas besoin de préfixer le nom de l'espace de noms lorsque vous utilisez cout, mais std Les autres éléments de l'espace de noms doivent toujours être préfixés par le nom de l'espace de noms, comme ceci :

#include <iostream>
using std::cout;

int main ()
{
 
   cout << "std::endl is used with std!" << std::endl;
   
   return 0;
}

Lorsque le code ci-dessus est compilé et exécuté, il produit les résultats suivants : Noms introduits par la directive

std::endl is used with std!

using suit les règles de portée normales. Le nom est visible en commençant par la directive using jusqu'à la fin de la 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, de sorte qu'un espace de noms est composé de plusieurs parties définies séparément. Divers composants d'un espace de noms peuvent être répartis sur plusieurs fichiers.

Ainsi, si un composant de l'espace de noms doit demander un nom défini dans un autre fichier, le nom doit toujours être déclaré. 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 {
   // 代码声明
}

Espaces de noms imbriqués

Les espaces de noms peuvent être des ensembles imbriqués, vous pouvez définir un espace de noms dans un autre espace de noms comme ceci :

namespace namespace_name1 {
   // 代码声明
   namespace namespace_name2 {
      // 代码声明
   }
}

Vous pouvez accéder aux membres dans un espace de noms imbriqué en utilisant l'opérateur :: :

// 访问 namespace_name2 中的成员
using namespace namespace_name1::namespace_name2;

// 访问 namespace:name1 中的成员
using namespace namespace_name1;

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

#include <iostream>
using namespace std;

// 第一个命名空间
namespace first_space{
   void func(){
      cout << "Inside first_space" << endl;
   }
   // 第二个命名空间
   namespace second_space{
      void func(){
         cout << "Inside second_space" << endl;
      }
   }
}
using namespace first_space::second_space;
int main ()
{
 
   // 调用第二个命名空间中的函数
   func();
   
   return 0;
}

Lorsque le code ci-dessus est compilé et exécuté, il produit les résultats suivants :

Inside second_space