0Pricing
C Academy · Урок

Многофайловые проекты

Заголовки и единицы трансляции

«Многофайловые проекты» — бесплатный урок C Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C Academy содержит 4 уроков всего.

Зачем разделять файлы

Реальные программы не помещаются в один файл .c. Разделение кода на несколько файлов:

  • Объединяет связанные функции
  • Позволяет компилятору пересобирать только изменившиеся части
  • Делает код повторно используемым в разных проектах
  • Позволяет команде работать без постоянных конфликтов

Понимание того, как эти части связываются, крайне важно.

Единицы трансляции

Каждый файл .c после раскрытия препроцессором его подключений #include становится единицей трансляции.

Компилятор независимо преобразует каждую единицу трансляции в объектный файл (.o). На этом этапе он ничего не знает о других файлах.

Объявление и определение

Объявление сообщает компилятору, что функция существует, и задаёт её сигнатуру. Определение содержит фактическое тело функции.

Другим файлам для вызова функции достаточно объявления. Определение должно находиться ровно в одном месте.

int add(int a, int b);          /* declaration: a promise */

int add(int a, int b) {         /* definition: the body */
    return a + b;
}

Файл заголовка

Объявления помещают в заголовок (.h). Любой файл, который хочет использовать функцию, подключает этот заголовок.

Заголовок является открытым интерфейсом, а соответствующий файл .c — закрытой реализацией.

/* math_utils.h */
#ifndef MATH_UTILS_H
#define MATH_UTILS_H

int add(int a, int b);
int mul(int a, int b);

#endif

Файл реализации

Файл .c подключает собственный заголовок и определяет функции.

Подключение собственного заголовка позволяет компилятору проверить соответствие определений объявлениям.

/* math_utils.c */
#include "math_utils.h"

int add(int a, int b) { return a + b; }
int mul(int a, int b) { return a * b; }

Использование модуля

Другой файл подключает заголовок и вызывает функции. Ему не нужно видеть их тела.

Компилятор доверяет объявлениям, а компоновщик позже связывает вызовы с настоящими определениями.

/* main.c */
#include <stdio.h>
#include "math_utils.h"

int main(void) {
    printf("%d\n", add(2, 3));
    return 0;
}

Компиляция и компоновка

Два этапа. Сначала скомпилируйте каждый файл в объектный файл с помощью -c. Затем объедините объектные файлы в один исполняемый файл.

Компоновщик разрешает каждый вызов add, находя его определение в math_utils.o.

gcc -c main.c          # -> main.o
gcc -c math_utils.c    # -> math_utils.o
gcc main.o math_utils.o -o app

Кавычки и угловые скобки

Синтаксис подключения управляет путём поиска:

  • #include "math_utils.h" сначала ищет файл в каталоге проекта
  • #include <stdio.h> ищет только в системных путях заголовков

Используйте кавычки для собственных заголовков, а угловые скобки — для стандартной библиотеки.

Ключевое слово extern

Чтобы использовать глобальную переменную в нескольких файлах, один раз определите её в файле .c, а в заголовке объявите с помощью extern.

extern означает: «эта переменная существует где-то ещё», — и предотвращает повторные определения.

/* in config.h */
extern int g_verbose;   /* declaration */

/* in config.c */
int g_verbose = 0;      /* the single definition */

Ключевое слово static

На уровне файла static делает функцию или переменную закрытой для её единицы трансляции.

Статическую вспомогательную функцию нельзя связать с другими файлами, что предотвращает конфликты имён и скрывает детали реализации. В C это способ пометить объект как внутренний.

/* visible only inside this .c file */
static int helper(int x) {
    return x * 2;
}

Правило единственного определения

Нестатическая функция или глобальный объект могут быть определены ровно один раз во всей программе. Объявлять их можно во многих файлах, но определить — только в одном.

Два определения add приводят к ошибке компоновщика, например multiple definition of 'add'. Поэтому тела функций не размещают в заголовочных файлах.

Быстрая проверка

Определите, что должно находиться в заголовочном файле.

Итоги

Теперь Вы умеете структурировать проект из нескольких файлов:

  • Каждый файл .c является единицей трансляции и независимо компилируется в файл .o
  • В заголовочных файлах находятся объявления, а каждое определение — в одном файле .c
  • Компоновщик разрешает вызовы между объектными файлами
  • extern делает глобальные объекты общими, а static оставляет символы локальными для файла

Далее: автоматизация сборки с помощью Makefile.

Часто задаваемые вопросы

Урок «Многофайловые проекты» бесплатный?

Да — полный текст урока «Многофайловые проекты» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C Academy, подпишись на CoddyKit PRO. Курс C Academy содержит 4 уроков всего.

Чему я научусь в уроке «Многофайловые проекты»?

Заголовки и единицы трансляции Ты практикуешь C Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C Academy?

Предыдущий опыт не требуется. C Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Многофайловые проекты»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C Academy?

Да. Каждый урок C Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

  1. Условная компиляция
  2. Многофайловые проекты
  3. Makefile
  4. Статические и разделяемые библиотеки
← Назад к C Academy