C++ namespace
Предположим, есть ситуация, когда в классе учатся две ученицы по имени Зара. Чтобы чётко различать их, помимо использования их имён, нам приходится использовать дополнительную информацию, например их домашние адреса, имена их родителей и так далее.
Такая же ситуация возникает и в приложениях на C++. Например, вы можете написать функцию с именем xyz(), и такая же функция xyz() также существует в другой доступной библиотеке. В этом случае компилятор не может определить, какую функцию xyz() вы используете.
Поэтому вводитсяnamespace. Эта концепция специально используется для решения вышеуказанной проблемы. Она может служить дополнительной информацией для различения функций, классов, переменных и т. д. с одинаковыми именами в разных библиотеках. Использование пространства имён определяет контекст. По сути, пространство имён определяет область видимости.
Возьмём пример из компьютерной системы: папка (каталог) может содержать несколько папок. Внутри каждой папки имена файлов не могут быть одинаковыми, но файлы в разных папках могут иметь одно и то же имя.

Определение пространства имён
Определение пространства имён использует ключевое словоnamespace, за которым следует имя пространства имён, как показано ниже:
Чтобы обратиться к функции или переменной с использованием пространства имён, нужно указать имя пространства имён перед ней, как показано ниже:
Давайте посмотрим, как пространство имён определяет область видимости для таких сущностей, как переменные или функции:
Пример
Когда приведённый выше код компилируется и выполняется, он выдаёт следующий результат:
Inside first_space Inside second_space
директива using
Вы можете использовать директивуusing namespace, чтобы при использовании пространства имен не нужно было указывать имя пространства имен перед именем. Эта директива сообщает компилятору, что последующий код будет использовать имена из указанного пространства имен.
Пример
Когда приведённый выше код компилируется и выполняется, он выдаёт следующий результат:
Inside first_space
Директиву using также можно использовать для указания конкретных элементов в пространстве имен. Например, если вы собираетесь использовать только часть cout пространства имен std, можно использовать инструкцию наподобие следующей:
using std::cout;
В последующем коде при использовании cout не нужно предварять его именем пространства имён, ноstdдругие элементы в пространстве имён всё ещё нужно предварять именем пространства имён, как показано ниже:
Пример
Когда приведённый выше код компилируется и выполняется, он выдаёт следующий результат:
std::endl is used with std!
usingИмена, введённые директивой, подчиняются обычным правилам области видимости. Имена видны с момента использования директивыusingдо конца этой области видимости. В этот момент сущности с тем же именем, определённые вне области видимости, скрыты.
Несмежные пространства имён
Пространство имён может быть определено в нескольких разных частях, поэтому пространство имён состоит из нескольких отдельно определённых частей. Различные компоненты пространства имён могут быть разбросаны по нескольким файлам.
Следовательно, если компоненту пространства имён нужно обратиться к имени, определённому в другом файле, ему всё равно нужно объявить это имя. Следующее определение пространства имён может определить новое пространство имён или добавить новые элементы в существующее пространство имён:
Вложенные пространства имён
Пространства имён могут быть вложенными. Можно определить другое пространство имён внутри пространства имён, как показано ниже:
Вы можете использовать::operator для доступа к членам вложенного пространства имён:
В приведенном выше операторе, если используется namespace_name1, то элементы в namespace_name2 в этой области видимости также доступны, как показано ниже:
Пример
Когда приведённый выше код компилируется и выполняется, он выдаёт следующий результат:
Inside second_spaceДругие расширения