Vincent Robert ha ragione nel suo commento Come usi correttamente gli spazi dei nomi in C ++? .
Usando lo spazio dei nomi
Gli spazi dei nomi sono usati almeno per evitare la collisione dei nomi. In Java, questo viene applicato attraverso il linguaggio "org.domain" (perché si suppone che non si userà nient'altro che il proprio nome di dominio).
In C ++, potresti dare uno spazio dei nomi a tutto il codice nel tuo modulo. Ad esempio, per un modulo MyModule.dll, è possibile assegnare al suo codice lo spazio dei nomi MyModule. Ho visto altrove qualcuno che utilizza MyCompany :: MyProject :: MyModule. Immagino che sia eccessivo, ma tutto sommato, mi sembra corretto.
Usando "usando"
L'uso dovrebbe essere usato con grande cura perché importa in modo efficace uno (o tutti) simboli da uno spazio dei nomi nel tuo attuale spazio dei nomi.
Questo è male farlo in un file di intestazione perché la tua intestazione inquinerà ogni sorgente incluso (mi ricorda le macro ...), e anche in un file di origine, stile cattivo al di fuori di un ambito di funzione perché verrà importato in ambito globale i simboli dallo spazio dei nomi.
Il modo più sicuro di usare "usando" è importare simboli selezionati:
void doSomething()
{
using std::string ; // string is now "imported", at least,
// until the end of the function
string a("Hello World!") ;
std::cout << a << std::endl ;
}
void doSomethingElse()
{
using namespace std ; // everything from std is now "imported", at least,
// until the end of the function
string a("Hello World!") ;
cout << a << endl ;
}
Vedrai molto "usare lo spazio dei nomi std;" in tutorial o codici di esempio. Il motivo è ridurre il numero di simboli per facilitare la lettura, non perché è una buona idea.
"using namespace std;" è scoraggiato da Scott Meyers (non ricordo esattamente quale libro, ma posso trovarlo se necessario).
Composizione nello spazio dei nomi
Gli spazi dei nomi sono più che pacchetti. Un altro esempio può essere trovato in "Il linguaggio di programmazione C ++" di Bjarne Stroustrup.
Nella "Special Edition", in 8.2.8 Composizione dello spazio dei nomi , descrive come unire due spazi dei nomi AAA e BBB in un altro chiamato CCC. Quindi CCC diventa un alias sia per AAA che per BBB:
namespace AAA
{
void doSomething() ;
}
namespace BBB
{
void doSomethingElse() ;
}
namespace CCC
{
using namespace AAA ;
using namespace BBB ;
}
void doSomethingAgain()
{
CCC::doSomething() ;
CCC::doSomethingElse() ;
}
È anche possibile importare simboli selezionati da diversi spazi dei nomi, per creare la propria interfaccia dello spazio dei nomi personalizzata. Devo ancora trovare un uso pratico di questo, ma in teoria è bello.
std
spazio dei nomi ai simboli piuttosto che usareusing
affatto. Quindi scrivo semprestd::cout
ostd::string
ora perché è quello che li chiamo adesso. Non scriverei maicout
.