Загрузка [MathJax]/jax/output/HTML-CSS/fonts/TeX/fontdata.js
 

printФункции и модули

printМодули и компиляция программы

Программа на языке Си состоит из одного или более модулей. Каждый модуль компилируется отдельно от других. Разделение программы на модули выполняется на этапе проектирования. Каждый модуль содержит функции и данные, имеющие некоторое общее назначение, и его разработку (кодирование) выполняет обычно один разработчик.

Модуль в Си разделяется на два файла: 1) заголовочный файл, имеющий расширение .h и содержащий объявления функций, глобальных переменных и типов данных; 2) файл реализации, имеющий расширение .c и содержащий определения функций и глобальных переменных.

Можно сделать один заголовочный файл для нескольких модулей. Для модуля с главной функцией программы заголовочный файл обычно не создается. Заголовочный файл подключается обязательно к соответствующему файлу реализации и к тем модулям, которым необходим доступ к функциям, типам и переменным этого модуля. Подключение к другим модулям можно делать как в файле реализации, так и в заголовочном файле с помощью команды #include. Добавлять файл реализации к программе нужно включая его в проект. В среде MinIDE проект создается автоматически из всех файлов, находящихся в текущей папке, если в файле локальных настроек указана строка build.goal=all, в других средах разработки для управления проектом используется специальное окно.

Пример заголовочного файла module1.h:

extern int answer; // объявление глобальных переменных
extern int data[10];
inline double sqr(double x) { return x*x; } // определение встраиваемой функции
int sumdigits(int n); // объявление глобальной функции, для функций extern можно не писать

Пример файла реализации module1.c:

#include "module1.h"
int answer=42; // определение глобальных переменных
int data[10];
static int id=0; // определение внутренней статической переменной модуля
static int max(int a, int b) { // определение внутренней функции модуля
  return a>b?a:b;
}
int sumdigits(int n) { // определение глобальной функции
  int sum=0;
  if(n<0) n=-n;
  while(n>0) {
    sum+=n%10;
    n/=10;
  }
  return sum;
}

Пример использования модуля:

#include "module1.h"
double max(double a, double b) { // определение глобальной функции
// допускается совпадение имен, так как имя max из module1 является внутренним
  return a>b?a:b;
}
int main() {
  printf("%d\n",sumdigits(sqr(answer)));
}

Для получения исполняемого файла из исходных файлов на языке Си выполняются следующие действия:

  1. Перед компиляцией каждый файл реализации обрабатывается препроцессором, который заменяет директивы #include на содержимое соответствующего заголовочного файла и применяет к исходному тексту все определения #define.

  2. Получившийся полный текст модуля компилятор транслирует в машинные коды и получается объектный файл с расширением .obj (в Linux – с расширением .o).

  3. Для получения исполняемой программы компоновщик собирает объектные файлы программы и объектные файлы из библиотек .lib (в Linux – архивов объектных файлов с расширением .a).

display:block;margin:auto|схема работы компилятора

loading