Программирование на C и C++

Онлайн справочник программиста на C и C++

Использование пространства имен

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

namespace имя {
// объявление объекта
}

Кроме того, можно использовать безымянное пространство имен, как показано ниже:

namespace {
// объявление объекта
}

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

Ниже приведен пример использования namespace:

namespace MyNameSpace {
int i, k;
void myfunc(int j) { cout << j; }
}

Здесь i, k и myfunc() составляют область видимости пространства имен MyNameSpace.

Поскольку пространство имен определяет область видимости, то для ссылки на объекты, опре­деленные в пространстве имен, необходимо использовать оператор области видимости. Напри­мер, чтобы присвоить значение 10 переменной i, необходимо использовать следующую инструк­цию:

MyNameSpace::i =10;

Если элементы области пространства имен будут использоваться часто, то можно использовать директиву using для упрощения доступа к ним. Инструкция using имеет две общие формы записи:

using namespace имя;

using имя::член;

В первом варианте имя определяет имя пространства имен, к которому нужно получить доступ. Все члены, определенные в указанном пространстве имен, могут быть использованы без использо­вания оператора области видимости. Во втором варианте только указанные члены пространства имен становятся видимыми. Например, для определенного выше пространства имен MyNameSpace следующее использование инструкции using является корректным:

using MyNameSpace::k; // видим только k
k = 10; // допустимо, поскольку k видим
using namespace MyNameSpace; // все члены MyNameSpace видимы
i = 10; // допустимо, поскольку все члены MyNameSpace видимы