Funkcje statyczne
Część sekcji Programowanie obiektowe ścieżki C w Coddy. Lekcja 4 z 61.
Gdy dzielisz kod na wiele plików, każda funkcja zdefiniowana w pliku źródłowym jest domyślnie widoczna dla innych plików. Czasami jednak potrzebujesz funkcji pomocniczych, które powinny być używane tylko wewnętrznie: funkcji, do których inne pliki nie powinny mieć dostępu ani nawet o nich wiedzieć.
Słowo kluczowe static, zastosowane do funkcji, ogranicza jej widoczność do pliku, w którym została zdefiniowana. Tworzy to prywatną funkcję, której nie można wywołać z innych plików źródłowych, nawet jeśli ktoś spróbuje ją zadeklarować.
// math_utils.c
#include "math_utils.h"
// Prywatna funkcja pomocnicza – widoczna tylko w tym pliku
static int square(int x) {
return x * x;
}
// Funkcja publiczna – można ją wywołać z main.c
int sum_of_squares(int a, int b) {
return square(a) + square(b);
}
W tym przykładzie sum_of_squares jest zadeklarowana w pliku nagłówkowym i może być używana wszędzie. Jednak square jest oznaczona jako static, więc istnieje tylko w pliku math_utils.c. Jeśli main.c spróbuje bezpośrednio wywołać square(), linker zgłosi błąd: ta funkcja po prostu nie istnieje poza swoim plikiem.
To sposób języka C na osiąganie enkapsulacji na poziomie pliku. Funkcje statyczne pozwalają ukrywać szczegóły implementacji i utrzymywać czysty interfejs publiczny, a jednocześnie korzystać z dowolnej logiki pomocniczej, której potrzebujesz wewnętrznie.
Wyzwanie
ŁatwyZbudujmy kalkulator odległości, który używa prywatnej funkcji pomocniczej do obliczania kwadratu liczby — szczegółu, który powinien pozostać ukryty przed resztą programu.
Utworzysz trzy pliki:
distance.h: plik nagłówkowy deklarujący jedną publiczną funkcjędistance_squared, która przyjmuje cztery liczby całkowite (x1, y1, x2, y2) reprezentujące dwa punkty i zwraca liczbę całkowitą. Dodaj strażniki nagłówka używające symboluDISTANCE_H.distance.c: plik źródłowy zawierający implementację. Utwórz statyczną funkcję pomocniczą o nazwiesquare, która przyjmuje liczbę całkowitą i zwraca jej kwadrat. Ta funkcja pomocnicza powinna być widoczna tylko w obrębiedistance.c. Następnie zaimplementujdistance_squared, używając swojej statycznej funkcji pomocniczej do obliczenia (x2-x1)² + (y2-y1)².main.c: główny plik, który dołącza plik nagłówkowy i używa publicznej funkcji. Funkcja pomocniczasquarenie powinna być tutaj dostępna — dostępna jest tylko funkcjadistance_squared.
Funkcja distance_squared oblicza kwadrat odległości euklidesowej między dwoma punktami. Dzięki oznaczeniu funkcji square jako statycznej ukrywasz ten szczegół implementacji przed kodem spoza distance.c.
Otrzymasz cztery liczby całkowite jako dane wejściowe: x1, y1, x2 i y2.
Wypisz kwadrat odległości w tym formacie:
Squared distance: {result}Na przykład dla punktów (0, 0) i (3, 4) wynik będzie następujący:
Squared distance: 25Spróbuj swoich sił
#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: Wywołaj distance_squared z wczytanymi współrzędnymi
// i wypisz wynik w formacie: "Squared distance: {result}"
return 0;
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania modularnego
Pliki nagłówkoweZabezpieczenia przed wielokrotnym dołączeniemPliki źródłoweFunkcje statycznePodsumowanie: kalkulator modularny4Enkapsulacja
Koncepcja niejawnych wskaźnikówDefiniowanie niejawnych strukturGettery i setteryWalidacja w setterachPowtórka: tajemnicze pudełko2Obiekty i metody
Struktury jako obiektyWskaźnik „self”Poprawność constWskaźnik czy wartośćMetody pomocniczePodsumowanie: menedżer punktów5Projekt: Proste konto bankowe
Konfiguracja projektuImplementacja konta8Polimorfizm
Wskaźniki do funkcji w strukturachSymulowanie metodKoncepcja interfejsuImplementowanie interfejsówIteracja polimorficznaPodsumowanie: Greeter11Wzorce projektowe w C
Wzorzec SingletonWzorzec fabrykiWzorzec iteratoraPodsumowanie: fabryka loggera3Cykl życia obiektu
Wzorzec konstruktoraWzorzec destruktoraInicjalizacja na stosieKopia głębokaPodsumowanie: klasa opakowująca ciąg znaków6Dziedziczenie przez kompozycję
Osadzanie strukturZasada pierwszego elementuDostęp do elementów klasy nadrzędnejKonwersja w górę hierarchiiPodsumowanie: hierarchia kształtów9Projekt: Rysownik kształtów
Przegląd projektuImplementacja kołaImplementacja prostokątaZastosowanie polimorfizmuKontener kształtówPoćwicz samodzielnie: Kompilator C online