espace de noms en C++ | Ensemble 2 (espace de noms étendu et espace de noms sans nom)

Nous avons introduit les espaces de noms dans l'ensemble 1 ci-dessous.
Espace de noms en C++ | Ensemble 1 (Introduction)

Définir un espace de noms :

Une définition d'espace de noms commence par le mot-clé namespace suivi du nom de l'espace de noms comme suit :

espace de noms  namespace_name 
{
// déclarations de code, c'est-à-dire variable  (int a;)
méthode (void add();)
cours ( élève de la classe{};)
}

Il est à noter qu’il n’y a pas de point-virgule (;) après l’accolade fermante.
Pour appeler la version compatible avec l'espace de noms d'une fonction ou d'une variable, ajoutez le nom de l'espace de noms comme suit :
nom_espace de noms : :code;  // le code peut être une fonction ou une classe variable.

La directive using :

Vous pouvez également éviter de pré-ajouter des espaces de noms avec la directive using namespace. Cette directive indique au compilateur que le code suivant utilise des noms dans l'espace de noms spécifié. 
L'espace de noms est donc implicite pour le code suivant :

C++
   #include          using     namespace     std  ;   // first name space   namespace     first_space   {      void     func  ()      {      cout      < <     'Inside first_space'      < <     endl  ;      }   }   // second name space   namespace     second_space   {      void     func  ()      {      cout      < <     'Inside second_space'      < <     endl  ;      }   }   using     namespace     first_space  ;   int     main     ()   {      // This calls function from first name space.      func  ();      return     0  ;   }   

Les noms introduits dans une directive using obéissent aux règles de portée normales. Le nom est visible du point de la directive using jusqu'à la fin de la portée dans laquelle se trouve la directive. Les entités portant le même nom définies dans une portée externe sont masquées.

Espaces de noms imbriqués :

Les espaces de noms peuvent être imbriqués où vous pouvez définir un espace de noms dans un autre espace de noms comme suit :

SYNTAX: namespace namespace_name1 { // code declarations namespace namespace_name2 { // code declarations } } 

Vous pouvez accéder aux membres d'un espace de noms imbriqué à l'aide des opérateurs de résolution comme suit :
// pour accéder aux membres de namespace_name2
en utilisant l'espace de noms namespace_name1::namespace_name2 ;
// pour accéder aux membres de l'espace de noms:name1
en utilisant l'espace de noms namespace_name1 ;


Dans les instructions ci-dessus, si vous utilisez namespace_name1, les éléments de namespace_name2 seront disponibles dans la portée comme suit :

C++
   #include          using     namespace     std  ;   // first name space   namespace     first_space   {      void     func  ()      {      cout      < <     'Inside first_space'      < <     endl  ;      }      // second name space      namespace     second_space      {      void     func  ()      {      cout      < <     'Inside second_space'      < <     endl  ;      }      }   }   using     namespace     first_space  ::  second_space  ;   int     main     ()   {      // This calls function from second name space.      func  ();          return     0  ;   }   


Il est également possible de créer plusieurs espaces de noms dans l'espace global. Cela peut être fait de deux manières. 
 

    espaces de noms ayant des noms différents  
     
CPP
   // A C++ program to show more than one namespaces    // with different names.   #include      using     namespace     std  ;   // first name space   namespace     first   {      int     func  ()     {     return     5  ;     }   }   // second name space   namespace     second   {      int     func  ()     {     return     10  ;     }   }   int     main  ()   {      // member function of namespace      // accessed using scope resolution operator      cout     &  lt  ;  &  lt  ;     first  ::  func  ()     &  lt  ;  &  lt  ;  &  quot  ;    n  &  quot  ;;         cout     &  lt  ;  &  lt  ;     second  ::  func  ()     &  lt  ;  &  lt  ;  &  quot  ;    n  &  quot  ;;         return     0  ;   }   

  • Sortir: 
     
5 10 
    Extension des espaces de noms (en utilisant le même nom deux fois)  
    Il est également possible de créer deux blocs d'espace de noms portant le même nom. Le deuxième bloc d’espace de noms n’est en réalité que la continuation du premier espace de noms. En termes plus simples, nous pouvons dire que les deux espaces de noms ne sont pas différents mais en réalité identiques et sont définis en partie. 
     
CPP
   // C++ program to demonstrate namespace extension   #include      using     namespace     std  ;   // first name space   namespace     first      {         int     val1     =     500  ;      }   // rest part of the first namespace   namespace     first      {         int     val2     =     501  ;      }   int     main  ()   {      cout     &  lt  ;  &  lt  ;     first  ::  val1     &  lt  ;  &  lt  ;  &  quot  ;    n  &  quot  ;;         cout     &  lt  ;  &  lt  ;     first  ::  val2     &  lt  ;  &  lt  ;  &  quot  ;    n  &  quot  ;;         return     0  ;   }   

  • Sortir: 
     
500 501 


Espaces de noms sans nom  
 

  • Ils sont directement utilisables dans le même programme et servent à déclarer des identifiants uniques.
  • Dans les espaces de noms sans nom, le nom de l'espace de noms n'est pas mentionné dans la déclaration de l'espace de noms.
  • Le nom de l'espace de noms est généré de manière unique par le compilateur.
  • Les espaces de noms sans nom que vous avez créés ne seront accessibles que dans le fichier dans lequel vous les avez créés.
  • Les espaces de noms sans nom remplacent la déclaration statique des variables.


 

CPP
   // C++ program to demonstrate working of unnamed    // namespaces   #include      using     namespace     std  ;   // unnamed namespace declaration   namespace      {      int     rel     =     300  ;      }   int     main  ()   {      cout     &  lt  ;  &  lt  ;     rel     &  lt  ;  &  lt  ;     &  quot  ;    n  &  quot  ;;     // prints 300      return     0  ;   }   

Sortir: 
 

300