Spazi dei nomi (C++)
Il linguaggio C++ fornisce un singolo spazio dei nomi globale. Ciò può comportare problemi di conflittualità tra nomi globali. Ad esempio, considerare questi due file di intestazione C++:
char func(char);
class String { ... };
// somelib.h
class String { ... };
Con queste definizioni, è impossibile utilizzare entrambi i file di intestazione in un unico programma; le classi String collideranno.
Uno spazio dei nomi è un'area dichiarativa che associa un identificatore aggiuntivo a tutti i nomi dichiarati al suo interno. L'identificatore aggiuntivo riduce la probabilità che un nome sia in conflitto con i nomi dichiarati in altre parti del programma. È possibile utilizzare lo stesso nome in spazi dei nomi distinti senza conflitti anche se i nomi vengono visualizzati nella stessa unità di conversione. Finché vengono visualizzati in spazi dei nomi distinti, ogni nome sarà univoco a causa dell'aggiunta dell'identificatore dello spazio dei nomi. Ad esempio:
namespace one {
char func(char);
class String { ... };
}
// somelib.h
namespace SomeLib {
class String { ... };
}
A questo punto i nomi di classe non andranno in conflitto in quanto diventeranno one::String, e SomeLib::String.
C++ non consente i nomi composti per gli spazi dei nomi.
// pluslang_namespace.cpp
// compile with: /c
// OK
namespace a {
namespace b {
int i;
}
}
// not allowed
namespace c::d { // C2653
int i;
}
Le dichiarazioni nello scope file di un'unità di traslazione, all'esterno di tutti gli spazi dei nomi, sono ancora membri dello spazio dei nomi globale.