в том смысле, что результат
Компиляция в языке С независима в том смысле, что результат одной компиляции не сохраняется для использования в другой. Если кто-то из вашей группы случайно напишет:
/* File func.c */
extern float global; /* Внешняя, только объявление */
int func(int parm) /* Внешняя по умолчанию */
{
return parm + global;
}
программа все еще может быть откомпилирована и скомпонована, а ошибка произойдет только во время выполнения. На моем компьютере целочисленное значение 4, присвоенное переменной global в main, воспринимается в файле func.c как очень малое число с плавающей точкой; после обратного преобразования к целому числу оно становится нулем, и функция возвращает 4, а не 8.
Как и в языке Fortran, проблему можно частично решить, используя включаемые файлы так, чтобы одни и те же объявления использовались во всех файлах. И объявление extern для функции или переменной, и определение могут появиться в одном и том же вычислении. Поэтому мы помещаем все внешние объявления в один или несколько включаемых файлов, в то время как единственное определение для каждой функции или переменной будет содержаться не более чем в одном файле «.с»:
/* File main.h */
extern int global; /* Только объявление */
/* File func.h */
extern int func(int parm); /* Только объявление */
/* File main.c */
#include "main.h"
#include "func.h"
int global; /* Определение */
int main(void)
{
return func(global) + 7;
}
/* File func.c */
#include "main.h"
#include "func.h"
int func(int parm) /* Определение */
{
return parm + global;
}
Спецификатор static
Забегая вперед, мы теперь покажем, как в языке С можно использовать свойства декомпозиции для имитации конструкции модуля других языков.