0Pricing
C Academy · Урок

Заголовочные и исходные файлы

Разделяйте объявления и код.

«Заголовочные и исходные файлы» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Заголовочные и исходные файлы
  2. Защита заголовков
  3. extern и связывание
  4. Компиляция нескольких файлов
← Назад к C Academy