Поскольку пространства с глобальной областью видимости добавляются к системе, то имеется возможность возникновения коллизии имен. Это становится особенно актуальным при использовании библиотек, разработанных различными независимыми производителями. Использование
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 видимы