Пространства имен (namespaces) в C++

Пространства имен (namespaces) в C++ Программирование и разработка

Пространства имен (namespaces) в C++

Пространство имен в C ++ — это обобщенная область видимости. Его объявление начинается с зарезервированного слова namespace, за которым следует имя по выбору программиста, а затем блок в фигурных скобках. Блок содержит базовые объявления и / или определения объектов, функций и других сущностей C ++.

Рассмотрим следующие два скалярных оператора в глобальной области в следующей программе:

#include
using namespace std;

int varId = 5;
float varId = 2.3;

int main()
{

return 0;
}

Попытка скомпилировать эту программу приводит к ошибке компиляции. Есть две переменные с одинаковым именем varId. Хотя это две разные переменные двух разных типов, int и float, компилятор отклоняет два объявления, потому что они имеют одно и то же имя. Следующая программа решает эту проблему, объявляя переменные с одинаковыми именами в двух разных обобщенных областях:

#include
using namespace std;

namespace NA
{
int varId = 5;
}

namespace NB
{
float varId = 2.3;
}

int main()
{
cout << NA::varId << \n;
cout << NB::varId << \n;

return 0;
}

Результат выглядит следующим образом:

5
2.3

В приведенной выше программе есть два пространства имен: NA, которое имеет определение целого числа, и NB, которое имеет определение числа с плавающей запятой, но с тем же именем, что и целое число для NA. Наконец, при запуске программы использовалось одно и то же имя для двух разных переменных. Обратите внимание, что для доступа к одному и тому же имени двух разных переменных необходимо использовать конкретное имя для пространства имен, за которым следует общий идентификатор. Имя пространства имен и общий идентификатор разделяются оператором разрешения области видимости » ::.» Имя пространств имен будет различать объекты.

В этой статье рассматривается основная концепция пространства имен и его использование в языке программирования C ++. Чтобы следовать этой статье, вы должны иметь базовые знания языка C ++. Вы также должны знать область действия C ++, хотя она кратко объясняется в этой статье. Чтобы узнать больше о области действия C ++, найдите фразу «Область действия в C ++» (без кавычек) в поле поиска любой веб-страницы linuxhint.com и нажмите Enter. Это приведет вас к статье, написанной этим автором.

Что такое пространство имен?

Декларативная область — это самая большая часть программы, в которой допустимо имя объекта (переменной). Эта область называется областью действия. Пространство имен в C ++ — это обобщенная область видимости, основной целью которой является разрешение конфликтов имен. Пространство имен имеет базовые объявления и / или определения сущностей.

Глобальное пространство имен и его проблема

Глобальное пространство имен — это глобальная область видимости. Рассмотрим следующую короткую программу:

#include
using namespace std;

int ident = 55;
float ident = 12.17;

int main()
{

return 0;
}

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

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

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

#include
using namespace std;

namespace NA
{
int varInt = 6;
float flt;
}

namespace NB
{
int varInt = 7;
float flt;
}

int main()
{
cout << NA::varInt << \n;
cout << NB::varInt << \n;
NA::flt = 2.5;
NB::flt = 4.8;
cout << NA::flt << \n;
cout << NB::flt << \n;

return 0;
}

Результат:

6
7
2,5
4,8

Обратите внимание, что имена NA :: flt и NB :: flt в конечном итоге определены в функции main (). C ++ не допускает такого определения в глобальной области видимости.

Обратите внимание, что настраиваемое пространство имен является вложенным пространством имен для глобального пространства имен.

Директива использования

Чтобы не вводить все время «namepace :: name» вместо просто «name» после объявления пространства имен, вы можете использовать директиву using. Синтаксис использования директивы using следующий:

using namespace Namespace_name;

С помощью директивы не директива препроцессора, поэтому она заканчивается точкой с запятой (;).

Следующая программа иллюстрирует использование директивы using и др.:

#include
using namespace std;

namespace NB
{
int varInt = 7;
int func ()
{
return varInt;
}
}

int fn()
{
using namespace NB;
int myVar2 =  func();
//other objects and functions from NB follow.
return myVar2;
}

int myVar3 = NB::func();

int main()
{
cout << fn() << ‘ ‘ << myVar3 << \n;

return 0;
}

Результат этой программы — 7 7. Термин » с использованием пространства имен NB; «Был помещен в начало определения fn (). FUNC () из пространства имен NB называют чуть ниже, что, без предшествующего с » NB ::.»

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

Имя func () из пространства имен NB нельзя увидеть под определением fn (), потому что » using namespace NB;» был помещен в область действия функции (блок). При этом условии, чтобы использовать функцию » func () » вне блока (области) пространства имен NB, ему должен предшествовать » NB :: «, как в следующем операторе:

int myVar3 = NB::func();

С помощью директивы присоединяется своим пространством имен с внешним гнездовым пространством именами из положения, в котором он находится на конец внешних вложенности имен. В следующей программе пространство имен NA объединено с глобальным пространством имен. Оба пространства имен затем расширяются в пространство имен определения функции fn (), в котором они объединяются с пространством имен NB. Пространство имен NB заканчивается в конце определения функции fn (), а два предыдущих пространства имен продолжаются до конца файла (считывания кода).

#include
using namespace std;

namespace NA
{
int varInt = 6;
int func ()
{
return varInt;
}

}

namespace NB
{
int varInt = 7;
int func ()
{
return varInt;
}
}

using namespace NA;
int myVar0 = varInt;
//other objects and functions from :: and NB follow.

int fn()
{
int myVar1 = varInt;
using namespace NB;
int myVar2 =  NB::func();
//other objects and functions from NB follow, till end of this scope.
return myVar1 + myVar2;
}

//Only objects and functions from :: and NB follow.

int myVar3 = NB::func();

int main()
{
cout << myVar0 << ‘ ‘ << fn() << ‘ ‘ << myVar3 << \n;

return 0;
}

На выходе будет 6, 13, 7.

Примечание. Глобальное пространство имен обозначается символом ::, что означает, что перед последующим оператором разрешения области нет ничего.

Под утверждением » using namespace NA; «Переменные из глобального пространства имен и пространства имен NA могут использоваться без указания их исходного пространства имен. Следующий оператор использует varInt пространства имен NA. Область объединенного пространства имен global и NA простирается в пространство имен функции fn (). Итак, varInt первого оператора в области видимости функции fn () относится к пространству имен NA.

Поскольку область для глобального пространства имен и пространства имен NA распространяется на всю область видимости fn (), после » int myVar2 = NB :: func ();, «Любое имя из пространства имен NB может использоваться только в области fn () без предшествующего ему» NB :: «, только если оно не встречается в NA и глобальных пространствах имен (блоках). В противном случае ему должно предшествовать » NB :: «. Область объединенных пространств имен для NA и global продолжается ниже определения fn () и в функцию main () до конца файла.

Расширение пространства имен NB начинается с » int myVar2 = NB :: func (); «В блоке fn () и заканчивается в конце блока определения fn ().

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

Области пространства имен

Пространство имен — это область видимости. Помимо глобального пространства имен (глобальная область видимости), любое пространство имен должно быть объявлено в блоке. Этот блок является первой частью возможных распределенных областей пространства имен. С помощью директивы using пространство имен может быть расширено как регионы в других областях.

Объекты, объявленные в теле пространства имен, называются членами этого пространства имен, а имена, введенные этими объявлениями в декларативную область пространства имен, называются именами членов этого пространства имен.

Вложенные пространства имен

Следующая программа показывает вложенные пространства имен:

#include
using namespace std;

namespace A
{
int i = 1;
namespace B
{
int i = 2;
namespace C
{
int i = 3;
}
}
}

int main()
{
cout << A::i << ‘ ‘ << A::B::i << ‘ ‘ <<  A::B::C::i << \n;

return 0;
}

Результат:

1 2 3

Обратите внимание, что доступ к трем значениям был осуществлен с помощью оператора разрешения области видимости.

Стандартное пространство имен

В C ++ есть библиотека, называемая стандартной библиотекой. Имена объектов, функций и других сущностей в этой библиотеке взяты из пространства имен, называемого стандартным пространством имен, записанного как std. Стандартная библиотека содержит подбиблиотеки, и одна из этих подбиблиотек — iostream. Библиотека iostream содержит объект cout, который используется для отправки результатов на консоль (терминал).

Имя cout должно находиться в пространстве имен std. Чтобы использовать iostream с его пространством имен std, программа должна быть следующей:

#include <iostream>
using namespace std;

Обратите внимание на использование директивы using и std. Термин » #include » является директивой препроцессора и не заканчивается точкой с запятой. Он включает в себя «файл» iostream в позиции своей директивы.

Заключение

Пространство имен — это область видимости. Описание (определение) пространства имен содержит базовые объявления и / или определения объектов, функций и других сущностей C ++. Вне определения пространства имен доступ к имени можно получить с помощью синтаксиса » namespaceName :: name «. Помимо глобального пространства имен (глобальная область видимости), любое пространство имен должно быть объявлено в блоке. Этот блок является первой частью возможных распределенных областей пространства имен. С помощью директивы using пространство имен может быть расширено как регионы в других областях. Пространства имен, регионы которых соединяются, не должны иметь одинаковые имена переменных в разных блоках пространств имен, так как это все равно вызовет конфликт имен.

Читайте также:  Как стать инженером DevOps
Оцените статью
bestprogrammer.ru
Добавить комментарий