Статические функции
Часть раздела Object Oriented Programming путешествия по C на Coddy — урок 4 из 61.
Когда вы разделяете код на несколько файлов, каждая функция, определенная в исходном файле, по умолчанию видна другим файлам. Но иногда вам нужны вспомогательные функции, которые должны использоваться только внутри — функции, к которым другие файлы не должны иметь доступа или даже знать о них.
Ключевое слово static, примененное к функции, ограничивает её видимость файлом, в котором она определена. Это создает приватную функцию, которую нельзя вызвать из других исходных файлов, даже если кто-то попытается её объявить.
// 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 на уровне файла. Статические функции позволяют скрыть детали реализации, сохраняя чистоту публичного интерфейса и используя любую необходимую вспомогательную логику внутри.
Задание
ЛегкоДавайте создадим калькулятор расстояния, который использует вспомогательную приватную функцию для вычисления квадрата числа — деталь, которая должна оставаться скрытой от остальной части вашей программы.
Вы создадите три файла:
distance.h: Ваш заголовочный файл, объявляющий одну публичную функциюdistance_squared, которая принимает четыре целых числа (x1, y1, x2, y2), представляющих две точки, и возвращает целое число. Включите guard-защиту, используя символDISTANCE_H.distance.c: Ваш исходный файл, содержащий реализацию. Создайте вспомогательную функциюstaticс именемsquare, которая принимает целое число и возвращает его квадрат. Эта вспомогательная функция должна быть видна только внутриdistance.c. Затем реализуйтеdistance_squared, используя вашу статическую вспомогательную функцию для вычисления (x2-x1)² + (y2-y1)².main.c: Ваш основной файл, который включает заголовочный файл и использует публичную функцию. Вспомогательная функцияsquareне должна быть доступна здесь — доступна толькоdistance_squared.
Функция distance_squared вычисляет квадрат евклидова расстояния между двумя точками. Делая функцию square статической, вы скрываете эту деталь реализации от любого кода вне distance.c.
Вы получите четыре целых числа на вход: x1, y1, x2 и y2.
Выведите квадрат расстояния в следующем формате:
Squared distance: {result}Например, для точек (0, 0) и (3, 4) вывод будет следующим:
Squared distance: 25Шпаргалка
Ключевое слово static ограничивает видимость функции файлом, в котором она определена, создавая приватную функцию, которую нельзя вызвать из других исходных файлов.
// Приватный помощник — виден только в этом файле
static int square(int x) {
return x * x;
}
// Публичная функция — может быть вызвана из других файлов
int sum_of_squares(int a, int b) {
return square(a) + square(b);
}
Статические функции обеспечивают инкапсуляцию на уровне файла, позволяя скрыть детали реализации, сохраняя при этом чистоту публичного интерфейса.
Попробуйте сами
#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 с входными координатами
// и выведите результат в формате: "Squared distance: {result}"
return 0;
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Object Oriented Programming
1Основы модульного программирования
Заголовочные файлыСтражи включенияИсходные файлыСтатические функцииПовторение: Модульный калькулятор4Инкапсуляция
Концепция непрозрачных указателейОпределение непрозрачных структурГеттеры и сеттерыВалидация в сеттерахИтоги: Секретный ящик2Объекты и методы
Структуры как объектыУказатель 'Self'Константная корректностьУказатель против значенияВспомогательные методыИтоги: Point Manager5Проект: Простой банковский счет
Настройка проектаРеализация счета3Жизненный цикл объекта
Паттерн «Конструктор»Паттерн «Деструктор»Инициализация в стекеГлубокое копированиеПовторение: String Wrapper6Наследование через композицию
Встраивание структурПравило первого элементаДоступ к элементам родителяUpcastingПовторение: Иерархия фигур9Проект: Рисование фигур
Обзор проектаРеализация круга