Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры по ПЯВУ.doc
Скачиваний:
4
Добавлен:
26.10.2018
Размер:
468.48 Кб
Скачать

10. Объявления и определения. Область существования имени.

Любое имя, за исключением имён меток, должно быть объявлено в программе:

int i, j;

double d=7.3;

extern int m;

typedef unsigned int size_t;

int add (int a, int b){ return a+b;}

void func (char*, int);

После этих объявлений компилятор знает, что i, j, m - имена переменных типа int, d - имя переменного типа double, size_t - имя типа, а add и func - имена функций.

В объявлении с именем может сопоставляться не только некоторый тип. С именем может быть сопоставлен некоторый элемент, идентификатором которого оно является. Например, при объявлении int i, j; для переменных i, j отводится память, с этими именами сопоставляются участки памяти по 2 байта, которые можно использовать для хранения значений переменных. С именем size_t сопоставлено имя конкретного типа (unsigned int), синонимом которого является теперь size_t; с именем add сопоставлен код функции. Все такие объявления называют определениями. Однако не все объявления являются определениями. Из всех вышеприведённых объявлений два не являются определениями:

extern int m;

void func (char *, int);

В первом из этих объявлений сообщается только, что переменная m имеет тип int, память же для неё должна выделяться где-то в другом месте, о чём говорит ключевое слово extern.

Второе объявление говорит, что func есть имя функции с двумя аргументами, первый из которых - указатель на char, а второй - int, а сама функция не возвращает никакого значения. Такое объявление называют прототипом функции. Сама же функция func должна быть определена вместе со своим телом где-то в другом месте.

В программе для каждого имени должно присутствовать одно и только одно определение, в то время как объявлений, не являющихся определениями, может быть как угодно много.

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

Текст программы можно разместить в одном файле, а можно и в нескольких различных файлах, каждый из которых содержит целиком одну или несколько функций. Для объединения в одну программу эти файлы компилируются совместно. Информация обо всех этих файлах помещается в так называемый файл проекта (с расширением .prj). Компилятор для каждого исходного файла создаёт объектный код (файл с расширением .obj). Затем все объектные файлы (вместе с библиотечными) объединяются компоновщиком в исполняемый, или загрузочный модуль, который имеет имя файла проекта и расширение .ехе. Область существования имени нужна компилятору для того, чтобы сгенерировать верный машинный код.

Можно выделит 5 видов областей существования имени.

Область существования БЛОК. Блок - это фрагмент программы, заключённый в фигурные скобки { }, например

if (a != 5) {

int j=0;

double k = 3.5;

a++;

...

}

Заметим, что тело любой функции является блоком.

Имя, объявленное в блоке, может быть использовано от точки, где находится его объявление, и до конца блока. Такую же область существования имеют и имена в определении функции:

int f1 (int i){ return i; }

Имя i имеет область существования "блок". Область существования "блок" распространяется и на вложенные блоки.

Область существования ФУНКЦИЯ. Эту область существования имеют только имена меток перехода, используемые оператором goto:

void f (){….

goto lab;

{... lab: ...}

...

}

Область существования ПРОТОТИП ФУНКЦИИ. Прототип функции есть объявление функции, не являющееся её определением и имеющий, например, вид: int F(int a, double b, char* str);

Область существования "прототип" заключена между открывающей и закрывающей круглыми скобками. Иначе говоря, имена a, b, str в примере определены только внутри круглых скобок. Из этого следует, что в прототипах можно использовать для аргументов любые имена или не использовать их совсем: int F(int, double, char*);

Область существования ФАЙЛ. Область существования "файл" имеют имена, объявленные вне любого блока и класса. Такие имена называют глобальными. Глобальные имена определены от точки их объявления и до конца файла, где встретилось их объявление. Примером таких имён являются имена функций.

#include

int a, b, c[40]; // Глобальные имена;

int f1() // локальное имя f1;

{int i; … // локальное имя;

}

int count; // глобальное имя;

void f2() { ... } // глобальное имя f2.

Область существования КЛАСС.

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