Файл Си-программы как элемент модульного программирования
Нас прежде всего будет интересовать, какими свойствами обладают переменные и функции, определенные в различных точках модуля-файла, как они "узнают" о существовании друг друга и как они взаимодействуют между собой. Для начала сформулируем ряд необходимых терминов.
ОПРЕДЕЛЕНИЕ ПЕРЕМЕННОЙ ИЛИ ФУНКЦИИ - - процесс создания программного эквивалента переменной или функции транслятором по их описанию в программе (трансляция во внутреннее представление)
Определение функции включает в себя заголовок функции и тело, определение переменной -обычное контекстное определение и, возможно, ее инициализацию.
int a = 5 , B[10]={ 1,6,3,6,4,6,47,55,44,77 };
В определении переменной:
-задан тип переменной;
-задано имя переменной;
-определяется размерность и резервируется память. Размерность массивов в определении обязательно должна быть задана;
-производится инициализация памяти;
-для доступа к переменной из других модулей в текущем модуле может быть создана точка входа.
int strcmp(char *s, char *d) { ... }
В определении функции:
-задан тип результата;
-задано имя функции;
-задан список формальных параметров и их типов;
-транслируется тело функции;
-для вызова функции из других модулей в текущем модуле может быть создана точка входа.
Например, определение размещается далее по тексту в текущем модуле или находится в другом модуле.
Переменная или функция при объявлении во внутреннее представление не переводятся, транслятору сообщается лишь факт их существования, имя и тип. Это необходимо для формирования правильного обращения к переменной или к функции.
extern int a,B[];
В объявлении переменной:
-задан тип переменной;
-задано имя переменной.
-запоминается факт наличия переменной с указанными именем и типом. Размерность массивов в объявлении может отсутствовать.
int strcmp();
int strcmp(char*, char*);
extern int strcmp();
extern int strcmp(char*, char*);
B объявлении функции:
-задается тип функции;
-задается имя функции;
-может быть задан список типов формальных параметров (прототип);
-запоминается факт наличия функции с указанными именем, результатом и, возможно, параметрами.
Различие между определением и объявлением имеет принципиальное значение: с определением связан процесс создания программного объекта, соответствующего переменной или функции, превращение их описания в программе во внутреннее представление в памяти (трансляция). Объявление - всего лишь подтверждение программистом факта существования переменной или функции, которые по каким-либо причинам транслятор в данный момент " не видит" . Объявлений одной и той же переменной или функции в программе может быть сколь угодно много, а определение -всегда одно. Кроме того, объявления транслятор всегда " принимает на веру" , поэтому ответственность за корректность объявлений несет программист.