Если речь идет о большом проекте, который создается несколькими разработчиками, всегда возможно перекрытие идентификаторов, определенных в разных местах программы. Поэтому желателен инструмент, позволяющий явным образом указывать области видимости идентификаторов.
Таким инструментом является объявление области видимости имен ключевым словом namespace и последующее объявление использования функции и переменных из той или иной области ключевым словом using.
Синтаксис объявления области видимости:
namespace имя_области {
объявления типов, переменных и функций
}
Например:
namespace А
{
int i = 1;
void F1(int i)
{
Form1->Label1->Caption = "Область A: i = " + IntToStr(i);
}
}
namespace B
{
int i = 2;
void F1(int i)
{
Form1->Label1->Caption = "Область В: i = " + IntToStr(i);
}
}
Приведенные операторы объявляют две области видимости с именами А и В. В обеих областях объявлены переменные i и функции F1.
Объявление области с тем же именем может повториться в программе и содержать объявления каких-то новых переменных и функций. Соответствующие идентификаторы добавятся в указанную область.
Доступ к объявленным переменным и функциям из любой точки файла может осуществляться несколькими способами. Самый простой с помощью операции разрешения области действия (::). Например, оператор:
В::F1(A::i);
вызовет функцию F1 из области В и передаст в нее значение переменной i из области А.
Подобный доступ гибкий, но он требует каждый раз указывать область видимости. Если явное указание областей видимости сделано для того, чтобы устранить появившиеся в программе случайные наложения идентификаторов, то явное указание при каждом применении идентификатора соответствующей области действия потребует исправлений во многих местах программы и может привести к появлению ошибок. Более простой способ указания области действия - применение ключевого слова using. Одна из возможных форм применения using:
using namespace имя_области;
Например, если поместить в тексте оператор
using namespace А;
то все последующие операторы будут брать идентификаторы из области А. Тогда, например, размещенный где-то в тексте после using оператор
F1(i);
вызовет функцию F1 из области А и передаст в нее значение переменной i из области А.
Операторы using могут иметь и другую форму, определяющую область для конкретного идентификатора:
using имя_области::идентификатор;
Например, после операторов
using А::F1;
using В::i;
оператор
F1(i);
вызовет функцию F1 из области А и передаст в нее значение переменной i из области В.
При объявлении области видимости с помощью namespace в теле объявления могут присутствовать не только объявления переменных и функций, но и операторы namespace, определяющие некоторые внутренние области видимости, и операторы using namespace, ссылающиеся на ранее определенные области. Таким образом, области видимости могут быть вложенные. Например, объявления могут иметь вид:
namespace A
{
...
}
namespace B
{
using namespace А;
...
namespace С
{
...
}
}
Здесь область В использует ранее объявленную область А и содержит внутри себя вложенную область С. Доступ к вложенным областям осуществляется последовательным применением операции разрешения области действия. Например:
using namespace В::С;