Введение |
Массивы, строки и структуры |
Операторы |
Операции |
Переменные и типы |
Пояснения к курсовой работе |
Препроцессор |
Работа с файлами |
Стандарты безопасного кодирования |
Указатели и динамическая память |
Ввод-вывод |
Программа на языке Си состоит из одного или более модулей. Каждый модуль компилируется отдельно от других. Разделение программы на модули выполняется на этапе проектирования. Каждый модуль содержит функции и данные, имеющие некоторое общее назначение, и его разработку (кодирование) выполняет обычно один разработчик.
Модуль в Си разделяется на два файла: 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)));
}
Для получения исполняемого файла из исходных файлов на языке Си выполняются следующие действия:
Перед компиляцией каждый файл реализации обрабатывается препроцессором, который заменяет директивы #include
на содержимое соответствующего заголовочного файла и применяет к исходному тексту все определения #define
.
Получившийся полный текст модуля компилятор транслирует в машинные коды и получается объектный файл с расширением .obj
(в Linux – с расширением .o
).
Для получения исполняемой программы компоновщик собирает объектные файлы программы и объектные файлы из библиотек .lib
(в Linux – архивов объектных файлов с расширением .a
).