Заголовочные и исходные файлы
Разделяйте объявления и код.
«Заголовочные и исходные файлы» — бесплатный урок C Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C Academy содержит 4 уроков всего.
Зачем разделять код на файлы
По мере роста программ на C хранить всё в одном файле .c становится неудобно для чтения и медленно для компиляции.
В C проект можно разделить на несколько файлов: каждый отвечает за одну задачу. Это улучшает организацию, позволяет повторно использовать код и означает, что изменение одной части не заставляет перекомпилировать всё.
Два вида файлов
Модульный проект на C использует два вида файлов.
Исходные файлы (.c) содержат собственную реализацию: тела функций и определения.
Заголовочные файлы (.h) содержат объявления: прототипы функций, определения типов и макросы, о которых должны знать другие файлы.
Заголовочный файл
Заголовок объявляет, что существует, но не объясняет, как это работает.
Здесь math_utils.h объявляет функцию add. Любой файл, подключивший этот заголовок, узнаёт сигнатуру функции и может её вызвать.
/* math_utils.h */
int add(int a, int b);Соответствующий исходный файл
Исходный файл содержит реализацию. Он подключает собственный заголовок, чтобы компилятор мог проверить соответствие определения объявлению.
Обратите внимание: заголовок подключён в кавычках — так подключают файлы собственного проекта.
/* math_utils.c */
#include "math_utils.h"
int add(int a, int b) {
return a + b;
}Использование модуля
Теперь main.c подключает заголовок и вызывает add. Он не видит тело функции, а только прототип.
Компилятор доверяет объявлению, а затем компоновщик связывает вызов с настоящей реализацией в math_utils.c.
/* main.c */
#include <stdio.h>
#include "math_utils.h"
int main(void) {
printf("%d\n", add(2, 3));
return 0;
}Кавычки и угловые скобки
Директива #include имеет две формы.
#include <stdio.h> использует угловые скобки для заголовков системных и стандартных библиотек. Компилятор ищет их в стандартных путях включения.
#include "math_utils.h" использует кавычки для собственных заголовков; сначала поиск выполняется в текущем каталоге.
#include <stdio.h> /* standard library */
#include "math_utils.h" /* your project */Что помещают в заголовочный файл
Помещайте в заголовки объявления, а не определения.
Подходимое содержимое заголовка: прототипы функций, объявления struct и typedef, макросы #define и объявления переменных extern.
Не помещайте туда тела функций или определения переменных: это может привести к ошибкам дублирования символов.
/* shapes.h */
typedef struct {
double width;
double height;
} Rect;
double rect_area(Rect r);Что помещают в исходный файл
Исходный файл содержит настоящую работу: определения функций и вспомогательные элементы, используемые только этим файлом.
Он подключает соответствующий заголовок, чтобы компилятор проверил совпадение сигнатур. Это позволяет обнаружить несоответствия заранее, а не во время компоновки.
/* shapes.c */
#include "shapes.h"
double rect_area(Rect r) {
return r.width * r.height;
}Объявление и определение
Это различие лежит в основе модульного программирования на C.
Объявление сообщает компилятору тип и сигнатуру имени, чтобы его можно было использовать: int add(int, int);
Определение создаёт настоящую сущность, выделяя память или предоставляя тело. Заголовки объявляют, исходные файлы определяют.
int add(int a, int b); /* declaration */
int add(int a, int b) { /* definition */
return a + b;
}Соглашения об именовании
Обычно каждый модуль объединяют по имени: logger.h с logger.c, parser.h с parser.c.
Так сразу видно, где находится реализация. Объединяйте связанные функции в один модуль, чтобы у каждого файла была одна понятная задача.
/* logger.h */
void log_info(const char *msg);
void log_error(const char *msg);Как выполняется сборка
Каждый файл .c независимо компилируется в объектный файл, после чего все объектные файлы связываются в одну программу.
Заголовки не компилируются отдельно: они вставляются как текст в исходные файлы, которые их подключают. Полный процесс сборки мы рассмотрим в следующем уроке.
gcc -c main.c /* -> main.o */
gcc -c math_utils.c /* -> math_utils.o */
gcc main.o math_utils.o -o appБыстрая проверка
Проверьте, насколько хорошо Вы понимаете назначение заголовочных и исходных файлов.
Итоги
Вы научились разделять проект на C на заголовочные файлы .h и исходные файлы .c.
Заголовки объявляют, что существует, а исходные файлы определяют, как это работает. Используйте кавычки для собственных заголовков и угловые скобки для стандартных.
Далее мы предотвратим проблемы, возникающие при многократном подключении заголовка.
Часто задаваемые вопросы
Урок «Заголовочные и исходные файлы» бесплатный?
Да — полный текст урока «Заголовочные и исходные файлы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C Academy, подпишись на CoddyKit PRO. Курс C Academy содержит 4 уроков всего.
Чему я научусь в уроке «Заголовочные и исходные файлы»?
Разделяйте объявления и код. Ты практикуешь C Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C Academy?
Предыдущий опыт не требуется. C Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Заголовочные и исходные файлы»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C Academy?
Да. Каждый урок C Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Заголовочные и исходные файлы
- Защита заголовков
- extern и связывание
- Компиляция нескольких файлов