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