Menu
Coddy logo textTech

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

Часть раздела Объектно-ориентированное программирование путешествия по 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.

challenge icon

Задание

Легко

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

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

  • distance.h: Ваш заголовочный файл, объявляющий единственную Public функцию distance_squared, которая takes четыре integer (x1, y1, x2, y2), представляющих две точки, и returns integer. Include guards с использованием символа DISTANCE_H.
  • distance.c: Ваш исходный файл, содержащий реализацию. Create static helper function с именем square, которая takes integer и returns его square. Этот helper должен быть видимым only within distance.c. Затем Implement distance_squared, using ваш static helper для вычисления (x2-x1)² + (y2-y1)².
  • main.c: Ваш main файл, который include заголовочный файл и использует Public функцию. Helper square не должен быть доступен здесь: available only distance_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;
}
quiz iconПроверьте себя

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

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор C