Extern int func1 (); //объявление функции, определенной в файлеf22.cpp

Extern double func2 (); //объявление функции, определенной в файлеf22.cpp

int main () {

cout << "main m=" << m << " " << func1() << endl; // 10 4
cout << x << " " << func2() << endl; // 100.56 102.56

return 0; }

Файл f22.cpp

int m=2;// определение в файле глобальной переменной m

Extern double x; // объявление переменной х, определенной в файлеf12.cpp //extern int i, например, даст ошибку, т.к. iне определено в файлеf12.cpp

int func1 () {return m * m; } //определение функции, m=2

double func2 () { return x + m; }// определение функции m=2; x=100.56

 

 
 

 


Пространство имен

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

Можно ограничить область видимости элементов программы, объявив их, например, внутри файла со спецификатором static. Однако и это не всегда решает проблему. Сегодня существует как бы альтернатива использованию static для уменьшения зоны видимости глобальных переменных до размеров одного файла.

В С++ имеется возможность использовать пространство имен,рекомендуемое новым стандартом языка. Пространство имен – область программы, в которой распознается определенная совокупность имен, которые неизвестны за пределами этого пространства имен.

Ключевое слово namespace путем объявления именованных областей позволяет разделить глобальное пространство имен и определяет область видимости. Стандартная библиотека С++ объявляется теперь не в глобальном пространстве имен, как было раньше, а в собственном пространстве std.

Директива using namespace std; означает, что все определенные ниже в программе имена будут относиться к пространству имен с именем std.

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

Namespace geo

{

int m = 10; //объявление глобальной переменной m в пространстве имен geo,

}

 

int geo:: n; //объявление глобальной переменной n также в пространстве имен geo,

 

Все, что определено внутри инструкции namespace (переменные, функции),находится внутри области видимости данного пространства имен, поэтому к идентификаторам, объявленным в этом пространстве имен, можно обращаться напрямую.

При обращении извне пространства имен к объектам, объявленным внутри этого пространства, следует указывать оператор расширения области видимости ::.

Чтобы упростить запись идентификаторов, используется инструкция using, имеющая две формы:

using namespace имя;

using имя::член;

 

При использовании первой формы инструкции using namespace имя; все члены, определенные в этом пространстве имен, становятся доступными в текущем пространстве и с ними можно работать напрямую, без указания имени пространства и оператора расширения области видимости. Пространство имен становится видимым от точки написания директивы. Область действия директивы можно сузить до блока, используя ее, например, в функции.

При использовании второй формы инструкции using имя::член;видимым делается только указанный член пространства имен.

 

Безымянное пространство имен позволяет создавать идентификаторы, являющиеся уникальными внутри некоторого файла (пространству имен присваивается имя файла). К членам этого пространства можно обращаться напрямую, без уточнений. Вне файла эти идентификаторы неизвестны.

 

Файл f13.cpp

#include <iostream.h>

namespace { //определение глобальной переменной m в безымянном пространстве имен,

int m = 10; } //т.е. переменная m доступна только в файле f13.cpp

double x = 100.56; //определение глобальной переменной в глобальном пространстве имен
extern int func1 (); //объявление функции, определенной в файле f23.cpp

externdouble func2 (); //объявление функции, определенной в файле f23.cpp

int main () {

cout << "main m=" << m << " " << func1() << endl; // 10 4

cout << x << " " << func2() << endl; // 100.56 102.56

return 0;

}

Файл f23.cpp

int m=2; //определение глобальной переменной m, доступной только в этом файле

extern double x; //объявление переменной, определенной в файле f13.cpp

int func1 () {return m * m; } //определение функции, m=2 из этого файла

double func2 () { return x + m; } //определение функции, m=2 из этого файла
// х – из файла f13.cpp