Поделиться через


Пространства имен (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;
}

Объявления, сделанные в области видимости файла блока трансляции, за пределами всех пространств имен, относятся к глобальному пространству имен.

Дополнительные сведения

См. также

Ссылки

Объявления