Menu
Coddy logo textTech

Статические функции

Часть раздела 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 на уровне файла. Статические функции позволяют скрыть детали реализации, сохраняя чистоту публичного интерфейса и используя любую необходимую вспомогательную логику внутри.

challenge icon

Задание

Легко

Давайте создадим калькулятор расстояния, который использует вспомогательную приватную функцию для вычисления квадрата числа — деталь, которая должна оставаться скрытой от остальной части вашей программы.

Вы создадите три файла:

  • 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;
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Object Oriented Programming