Исходные файлы
Часть раздела Объектно-ориентированное программирование путешествия по C на Coddy. Урок 3 из 61.
До сих пор мы размещали объявления функций в заголовочных файлах, но фактический код функций (определение) находился в главном файле. Следующий шаг в модульном программировании — переместить эти определения в отдельные файлы исходного кода (файлы .c).
Это создаёт чёткую структуру из трёх частей: header объявляет функции, отдельный исходный файл определяет их, а main просто использует их. Вот как это выглядит:
// math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H
int add(int a, int b);
#endif
// math_utils.c
#include "math_utils.h"
int add(int a, int b) {
return a + b;
}
// main.c
#include <stdio.h>
#include "math_utils.h"
int main() {
printf("%d\n", add(5, 3));
return 0;
}
Обратите внимание, что math_utils.c включает собственный header. Это гарантирует, что определение function соответствует объявлению; если они не совпадают, компилятор обнаружит ошибку. Для использования function файлу main нужно только включить header; ему не нужно знать, как внутри работает add.
Это разделение скрывает детали реализации и позволяет изменять логику function, не затрагивая файлы, которые используют эти function.
Задание
ЛегкоДавайте создадим простой математический инструмент, организовав код в правильную структуру из трёх файлов: заголовочный файл для объявлений, исходный файл для реализаций и основной файл, который их использует.
Вы создадите три файла:
math_ops.h: заголовочный файл, содержащий объявления функций для двух операций:multiplyиsubtract. Обе функции принимают два integer и возвращают integer. Не забудьте добавить include guards с использованием символаMATH_OPS_H.math_ops.c: исходный файл, содержащий фактические реализацииmultiplyиsubtract. Этот файл должен подключать собственный заголовочный файл, чтобы гарантировать соответствие объявлений определениям.main.c: основной файл, который подключает заголовочный файл и использует обе функции для выполнения вычислений.
Функция multiply должна возвращать product двух integers, а subtract должна возвращать first integer минус second.
Вы получите два integer-ввода: a и b.
В вашей основной функции выведите results обеих операций в отдельных строках:
Product: {result of multiply}
Difference: {result of subtract}Например, для входных данных 8 и 3 результатом будет:
Product: 24
Difference: 5Попробуйте сами
#include <stdio.h>
#include "math_ops.h"
int main() {
int a, b;
scanf("%d", &a);
scanf("%d", &b);
// TODO: Вызовите функцию multiply с a и b, сохраните результат
// TODO: Вызовите функцию subtract с a и b, сохраните результат
// TODO: Выведите результаты в формате:
// Произведение: {результат multiply}
// Разность: {результат subtract}
return 0;
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы модульного программирования
Заголовочные файлыСтражи включенияИсходные файлыСтатические функцииПовторение: Модульный калькулятор4Инкапсуляция
Концепция непрозрачных указателейОпределение непрозрачных структурГеттеры и сеттерыВалидация в сеттерахИтоги: Секретный ящик2Объекты и методы
Структуры как объектыУказатель 'Self'Константная корректностьУказатель против значенияВспомогательные методыИтоги: Point Manager5Проект: Простой банковский счет
Настройка проектаРеализация счета3Жизненный цикл объекта
Паттерн «Конструктор»Паттерн «Деструктор»Инициализация в стекеГлубокое копированиеПовторение: String Wrapper6Наследование через композицию
Встраивание структурПравило первого элементаДоступ к элементам родителяUpcastingПовторение: Иерархия фигур9Проект: Рисование фигур
Обзор проектаРеализация кругаРеализация прямоугольникаПолиморфное использованиеКонтейнер фигурПотренируйтесь самостоятельно: Онлайн-компилятор C