Przestrzenie nazw (C++)
Język C++ dostarcza pojedynczą globalną przestrzeń nazw.Może to powodować problemy z kolizjami nazw globalnych.Rozważmy na przykład, te dwa pliki nagłówkowe C++:
char func(char);
class String { ... };
// somelib.h
class String { ... };
Z tymi definicjami, niemożliwe jest użycie obu plików nagłówkowych w jednym programie; klasy String będą w konflikcie.
Przestrzeń nazw jest regionem deklaracyjnym dołączającym dodatkowy identyfikator do każdej nazwy zadeklarowanej wewnątrz niego.Identyfikator dodatkowy zmniejsza prawdopodobieństwo, że nazwa znajdzie się w konflikcie z nazwami zadeklarowanymi w innych miejscach programu.Użytkownik może użyć tej samej nazwy w oddzielnych przestrzeniach nazw bez konfliktu, nawet jeśli nazwy pojawiają się w tej samej jednostce translacji.Tak długo, jak pojawiają się w osobnych przestrzeniach nazw, każda nazwa będzie unikatowa ze względu na dodanie identyfikatora przestrzeni nazw.Na przykład:
namespace one {
char func(char);
class String { ... };
}
// somelib.h
namespace SomeLib {
class String { ... };
}
Teraz nazwy klas nie będą ze sobą w konflikcie, ponieważ stają się odpowiednio one::String i SomeLib::String.
C++ nie zezwala na nazwy złożone dla przestrzeni nazw.
// pluslang_namespace.cpp
// compile with: /c
// OK
namespace a {
namespace b {
int i;
}
}
// not allowed
namespace c::d { // C2653
int i;
}
Deklaracje w zakresie pliku jednostki translacji, poza wszystkimi przestrzeniami nazw, są nadal elementami członkowskimi globalnej przestrzeni nazw.