Пространства имен (C++)
Язык C++ предоставляет единое глобальное пространство имен. Это может вызывать проблемы с конфликтами глобальных имен. Рассмотрим, например, следующие два файла заголовков C++:
char func(char);
class String { ... };
// somelib.h
class String { ... };
Эти определения делают невозможным использование обоих файлов заголовков в одной программе: возникнет конфликт имен классов String.
Пространство имен представляет собой область определения, которая добавляет дополнительный идентификатор к любым объявленным в ней именам. Дополнительный идентификатор снижает вероятность того, что имя будет конфликтовать с именами, объявленными в другом месте программы. Одинаковые имена из разных пространств имен можно использовать без возникновения конфликтов, даже если эти имена находятся в одном блоке трансляции. Если они находятся в разных пространствах имен, каждое из них будет уникальным благодаря добавлению идентификатора пространства имен. Например:
namespace one {
char func(char);
class String { ... };
}
// somelib.h
namespace SomeLib {
class String { ... };
}
Теперь конфликт имен классов не возникнет, поскольку они получат форму one::String и SomeLib::String соответственно.
Составные имена пространств имен в C++ не допускаются.
// pluslang_namespace.cpp
// compile with: /c
// OK
namespace a {
namespace b {
int i;
}
}
// not allowed
namespace c::d { // C2653
int i;
}
Объявления, сделанные в области видимости файла блока трансляции, за пределами всех пространств имен, относятся к глобальному пространству имен.