С отличается от других языков
Раздельная компиляция в языке С
Язык С отличается от других языков программирования тем, что понятие файла с исходным кодом появляется в определении языка и, что существенно, в терминах области действия и видимости идентификаторов. Язык С поощряет раздельную компиляцию до такой степени, что по умолчанию к каждой подпрограмме и каждой глобальной переменной можно обращаться отовсюду в программе.
Вначале немного терминологии: объявление вводит имя в программу:
void proc(void);
Имя может иметь много (идентичных) объявлений, но только одно из них будет также и определением, которое создает объект этого имени: отводит память для переменных или задает реализацию подпрограммы.
Следующий файл содержит главную программу main, а также определение глобальной переменной и объявление функции, имена которых по умолчанию подлежат внешнему связыванию:
/* File main.c */
int global; /* Внешняя по умолчанию */
int func(int); /* Внешняя по умолчанию */
int main(void)
{
global = 4;
return func(global);
}
В отдельном файле дается определение (реализация) функции; переменная global объявляется снова, чтобы функция имела возможность к ней обратиться:
/* File func.c */
extern int global; /* Внешняя, только объявление */
int func(int parm)
{
return parm + global:
}
Обратите внимание, что еще одно объявление func не нужно, потому что определение функции в этом файле служит также и объявлением, и по умолчанию она внешняя. Однако для того чтобы func имела доступ к глобальной переменной, объявление переменной дать необходимо, и должен использоваться спецификатор extern. Если extern не используется, объявление переменной global будет восприниматься как второе определение переменной. Произойдет ошибка компоновки, так как в программе запрещено иметь два определения для одной и той же глобальной переменной.