Шаг 36.
Библиотека STL.
Пространства имен

    На этом шаге мы рассмотрим использование пространства имен.

    С появлением новых библиотек, модулей и компонентов возрастает вероятность конфликтов имен при их одновременном использовании. Пространства имен помогают решить эту проблему.

    Пространство имен объединяет идентификаторы в именованной области видимости. При этом имя пространства является единственным глобальным идентификатором, который может конфликтовать с другими глобальными именами. По аналогии с членами классов идентификаторы, входящие в пространство имен, уточняются именем этого пространства с оператором ::, как показано ниже:

// Определение идентификаторов в пространстве имен josuttis 
namespace josuttis 
{
  class File;
  void myGlobalFunc();
  .   .   .   .
}
.   .   .   .
// Использование идентификатора, входящего в пространство имен 
josuttis::File obj:
.   .   .   .
josuttis::myGlobalFunc();

    В отличие от классов пространства имен открыты для новых определений и расширений. Следовательно, пространства имен могут использоваться для определения модулей, библиотек или компонентов, причем даже в разных файлах. Пространства имен определяют логические, а не физические модули.

    Если какие-либо типы аргументов определены в пространстве имен, в котором определена функция, то при вызове функции уточнять пространство имен не обязательно. Пример:

// Определение идентификаторов в пространстве имен josuttis 
namespace josuttis 
{
  class File; 
  void myGlobalFunc( const File&);
  .   .   .   .
}
.   .   .   .
josuttis::File obj:
.   .   .   .
myGlobalFunc(obj):    // Функция josuttis:myGlobalFunc будет успешно найдена

    Объявление using помогает избежать утомительных многократных повторений уточняющего префикса. Например, следующее объявление означает, что в текущей области видимости идентификатор File является локальным синонимом для josuttis::File:

using josuttis::File;

    С другой стороны, директива using открывает доступ ко всем именам заданного пространства имен так, как если бы они были объявлены за его пределами. Это может привести к возникновению обычных конфликтов. Например, представленная ниже директива делает идентификаторы File и myGlobalFunc() глобальными в текущей области видимости:

using namespace josuttis;

    Если в глобальной области видимости уже существуют идентификаторы File или myGlobalFunc(), то при использовании имен из пространства josuttis без уточняющих префиксов компилятор сообщает о неоднозначности ссылки.

    Никогда не используйте директиву using при отсутствии полной информации о контексте (например, в заголовочных файлах, модулях или библиотеках). Директива может изменить область видимости идентификаторов в пространстве имен, что приведет к нарушению работы программы при включении или использовании программного кода другого модуля. Вообще говоря, присутствие директив using в заголовочных файлах считается признаком плохого проектирования.

    В библиотеке STL все идентификаторы определяются в пространстве имен std.

    На следующем шаге мы рассмотрим использование типа bool.




Предыдущий шаг Содержание Следующий шаг