spazio dei nomi in C++ | Set 2 (estensione dello spazio dei nomi e spazio dei nomi senza nome)

Abbiamo introdotto gli spazi dei nomi nel set 1 di seguito.
Spazio dei nomi in C++ | Set 1 (Introduzione)

Definizione di uno spazio dei nomi:

Una definizione di spazio dei nomi inizia con la parola chiave namespace seguita dal nome dello spazio dei nomi come segue:

spazio dei nomi  nome_spazio dei nomi 
{
// dichiarazioni di codice, ad esempio variabile  (int a;)
metodo (void add();)
classi (studente di classe{};)
}

È da notare che non c'è il punto e virgola (;) dopo la parentesi graffa di chiusura.
Per chiamare la versione abilitata allo spazio dei nomi di una funzione o di una variabile, anteporre il nome dello spazio dei nomi come segue:
nome_spazio_nome: :codice;  // il codice potrebbe essere una funzione o una classe variabile.

La direttiva using:

Puoi anche evitare di anteporre gli spazi dei nomi con la direttiva using namespace. Questa direttiva indica al compilatore che il codice successivo utilizza nomi nello spazio dei nomi specificato. 
Lo spazio dei nomi è quindi implicito per il seguente codice:

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

I nomi introdotti in una direttiva using obbediscono alle normali regole di ambito. Il nome è visibile dal punto della direttiva using fino alla fine dell'ambito in cui si trova la direttiva. Le entità con lo stesso nome definite in un ambito esterno vengono nascoste.

Spazi dei nomi nidificati:

Gli spazi dei nomi possono essere nidificati in cui è possibile definire uno spazio dei nomi all'interno di un altro spazio dei nomi come segue:

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

È possibile accedere ai membri dello spazio dei nomi nidificato utilizzando gli operatori di risoluzione come segue:
// per accedere ai membri di namespace_name2
utilizzando lo spazio dei nomi namespace_name1::namespace_name2;
// per accedere ai membri di namespace:name1
utilizzando lo spazio dei nomi namespace_name1;


Nelle dichiarazioni precedenti, se stai utilizzando namespace_name1, gli elementi di namespace_name2 saranno disponibili nell'ambito come segue:

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


È anche possibile creare più di uno spazio dei nomi nello spazio globale. Questo può essere fatto in due modi. 
 

    spazi dei nomi con nomi diversi  
     
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  ;   }   

  • Produzione: 
     
5 10 
    Estensione degli spazi dei nomi (utilizzo dello stesso nome due volte)  
    È anche possibile creare due blocchi di namespace con lo stesso nome. Il secondo blocco dello spazio dei nomi non è altro che in realtà la continuazione del primo spazio dei nomi. In parole più semplici possiamo dire che entrambi i namespace non sono diversi ma in realtà gli stessi che vengono definiti in parti. 
     
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  ;   }   

  • Produzione: 
     
500 501 


Spazi dei nomi senza nome  
 

  • Sono utilizzabili direttamente nello stesso programma e vengono utilizzati per dichiarare identificatori univoci.
  • Negli spazi dei nomi senza nome il nome dello spazio dei nomi non è menzionato nella dichiarazione dello spazio dei nomi.
  • Il nome dello spazio dei nomi viene generato in modo univoco dal compilatore.
  • Gli spazi dei nomi senza nome che hai creato saranno accessibili solo all'interno del file in cui li hai creati.
  • Gli spazi dei nomi senza nome sostituiscono la dichiarazione statica delle variabili.


 

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

Produzione: 
 

300