Статические функции
Часть раздела Объектно-ориентированное программирование путешествия по C на Coddy. Урок 4 из 61.
Когда вы разделяете код между несколькими file, каждая function, определённая в исходном file, по умолчанию видима для other files. Но иногда вам нужны вспомогательные function, которые должны использоваться only внутри: function, к которым other files не должны получать доступ и о которых даже не должны знать.
Ключевое слово static, применённое к функции, ограничивает её видимость файлом, в котором она определена. Это создаёт Private функцию, которую нельзя вызвать из других исходных файлов, даже если кто-то попытается её Declare.
// math_utils.c
#include "math_utils.h"
// Приватный хелпер — виден только в этом файле
static int square(int x) {
return x * x;
}
// Публичная функция — может быть вызвана из main.c
int sum_of_squares(int a, int b) {
return square(a) + square(b);
}
В этом примере sum_of_squares объявлена в заголовочном файле и может использоваться где угодно. Однако square помечена как static, поэтому она существует только внутри math_utils.c. Если main.c попытается напрямую вызвать square(), компоновщик выдаст ошибку: этой функции просто не существует за пределами её файла.
Это способ C добиться инкапсуляции на уровне file. static function позволяют скрыть детали реализации, сохраняя чистым общедоступный интерфейс и используя любую необходимую внутреннюю логику helper.
Задание
ЛегкоДавайте создадим калькулятор расстояния, который использует private helper функцию для вычисления квадрата числа: деталь, которая должна оставаться скрытой от остальной части вашей программы.
Вы создадите четыре файла:
distance.h: Ваш заголовочный файл, объявляющий единственную Public функциюdistance_squared, которая takes четыре integer (x1, y1, x2, y2), представляющих две точки, и returns integer. Include guards с использованием символаDISTANCE_H.distance.c: Ваш исходный файл, содержащий реализацию. Createstatichelper function с именемsquare, которая takes integer и returns его square. Этот helper должен быть видимым only withindistance.c. Затем Implementdistance_squared, using ваш static helper для вычисления (x2-x1)² + (y2-y1)².main.c: Ваш main файл, который include заголовочный файл и использует Public функцию. Helpersquareне должен быть доступен здесь: available onlydistance_squared.
Функция distance_squared вычисляет квадрат евклидова расстояния между двумя точками. Сохраняя функцию square static, вы скрываете эту деталь реализации от любого кода за пределами distance.c.
Вы получите four integer inputs: x1, y1, x2 и y2.
Выведите квадрат расстояния в следующем формате:
Squared distance: {result}Например, для точек (0, 0) и (3, 4) результатом будет:
Squared distance: 25Попробуйте сами
#include <stdio.h>
#include "distance.h"
int main() {
int x1, y1, x2, y2;
scanf("%d", &x1);
scanf("%d", &y1);
scanf("%d", &x2);
scanf("%d", &y2);
// TODO: Вызовите distance_squared с входными координатами
// and print the result in the format: "Squared distance: {result}"
return 0;
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы модульного программирования
Заголовочные файлыСтражи включенияИсходные файлыСтатические функцииПовторение: Модульный калькулятор4Инкапсуляция
Концепция непрозрачных указателейОпределение непрозрачных структурГеттеры и сеттерыВалидация в сеттерахИтоги: Секретный ящик2Объекты и методы
Структуры как объектыУказатель 'Self'Константная корректностьУказатель против значенияВспомогательные методыИтоги: Point Manager5Проект: Простой банковский счет
Настройка проектаРеализация счета3Жизненный цикл объекта
Паттерн «Конструктор»Паттерн «Деструктор»Инициализация в стекеГлубокое копированиеПовторение: String Wrapper6Наследование через композицию
Встраивание структурПравило первого элементаДоступ к элементам родителяUpcastingПовторение: Иерархия фигур9Проект: Рисование фигур
Обзор проектаРеализация кругаРеализация прямоугольникаПолиморфное использованиеКонтейнер фигурПотренируйтесь самостоятельно: Онлайн-компилятор C