espacio de nombres en C++ | Conjunto 2 (espacio de nombres extendido y espacio de nombres sin nombre)

Hemos introducido espacios de nombres en el siguiente conjunto 1.
Espacio de nombres en C++ | Conjunto 1 (Introducción)

Definiendo un espacio de nombres:

Una definición de espacio de nombres comienza con la palabra clave espacio de nombres seguida del nombre del espacio de nombres de la siguiente manera:

espacio de nombres  nombre_espacio_nombres 
{
// declaraciones de código, es decir, variable (int a;)
método (void add();)
clases ( clase estudiante{};)
}

Cabe señalar que no hay punto y coma (;) después de la llave de cierre.
Para llamar a la versión habilitada para espacios de nombres de una función o variable, anteponga el nombre del espacio de nombres de la siguiente manera:
nombre_espacio_nombre: :código;  // el código podría ser una función o clase variable.

La directiva de uso:

También puede evitar anteponer espacios de nombres con la directiva de espacio de nombres. Esta directiva le dice al compilador que el código posterior utiliza nombres en el espacio de nombres especificado. 
Por tanto, el espacio de nombres está implícito en el siguiente código:

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  ;   }   

Los nombres introducidos en una directiva de uso obedecen a reglas de alcance normales. El nombre es visible desde el punto de la directiva de uso hasta el final del alcance en el que se encuentra la directiva. Las entidades con el mismo nombre definidas en un ámbito externo están ocultas.

Espacios de nombres anidados:

Los espacios de nombres se pueden anidar donde puede definir un espacio de nombres dentro de otro espacio de nombres de la siguiente manera:

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

Puede acceder a los miembros del espacio de nombres anidado utilizando operadores de resolución de la siguiente manera:
// para acceder a los miembros de namespace_name2
usando el espacio de nombres namespace_name1::namespace_name2;
// para acceder a los miembros del espacio de nombres:nombre1
usando el espacio de nombres namespace_name1;


En las declaraciones anteriores, si está utilizando namespace_name1, los elementos de namespace_name2 estarán disponibles en el alcance de la siguiente manera:

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  ;   }   


También es posible crear más de un espacio de nombres en el espacio global. Esto se puede hacer de dos maneras. 
 

    espacios de nombres que tienen nombres diferentes  
     
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  ;   }   

  • Producción: 
     
5 10 
    Ampliar espacios de nombres (usar el mismo nombre dos veces)  
    También es posible crear dos bloques de espacio de nombres con el mismo nombre. El segundo bloque de espacio de nombres no es más que la continuación del primer espacio de nombres. En palabras más simples, podemos decir que ambos espacios de nombres no son diferentes, sino que en realidad son iguales y se definen en partes. 
     
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  ;   }   

  • Producción: 
     
500 501 


Espacios de nombres sin nombre  
 

  • Se pueden utilizar directamente en el mismo programa y se utilizan para declarar identificadores únicos.
  • En espacios de nombres sin nombre, el nombre del espacio de nombres no se menciona en la declaración del espacio de nombres.
  • El nombre del espacio de nombres lo genera de forma única el compilador.
  • Solo se podrá acceder a los espacios de nombres sin nombre que haya creado dentro del archivo en el que los creó.
  • Los espacios de nombres sin nombre reemplazan la declaración estática de 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  ;   }   

Producción: 
 

300