Statische Funktionen
Teil des Abschnitts Objektorientierte Programmierung der C-Journey von Coddy. Lektion 4 von 61.
Wenn du Code auf mehrere Dateien aufteilst, ist jede in einer Quelldatei definierte Funktion standardmäßig für andere Dateien sichtbar. Manchmal benötigst du jedoch Hilfsfunktionen, die nur intern verwendet werden sollen: Funktionen, auf die andere Dateien weder zugreifen noch von denen sie überhaupt wissen sollten.
Das Schlüsselwort static beschränkt, wenn es auf eine Funktion angewendet wird, deren Sichtbarkeit auf die Datei, in der sie definiert ist. Dadurch entsteht eine private Funktion, die nicht aus anderen Quelldateien aufgerufen werden kann, selbst wenn jemand versucht, sie zu deklarieren.
// math_utils.c
#include "math_utils.h"
// Privater Helfer – nur in dieser Datei sichtbar
static int square(int x) {
return x * x;
}
// Öffentliche Funktion – kann von main.c aufgerufen werden
int sum_of_squares(int a, int b) {
return square(a) + square(b);
}
In diesem Beispiel wird sum_of_squares im Header deklariert und kann überall verwendet werden. square ist jedoch als static gekennzeichnet und existiert daher nur innerhalb von math_utils.c. Wenn main.c versucht, square() direkt aufzurufen, erzeugt der Linker einen Fehler: Die Funktion existiert außerhalb ihrer Datei einfach nicht.
So erreicht C Kapselung auf Dateiebene. Statische Funktionen ermöglichen es dir, Implementierungsdetails zu verbergen und deine öffentliche Schnittstelle übersichtlich zu halten, während du intern beliebige benötigte Hilfslogik verwendest.
Aufgabe
EinfachErstelle einen Distanzrechner, der eine private Hilfsfunktion verwendet, um das Quadrat einer Zahl zu berechnen – ein Detail, das vor dem restlichen Programm verborgen bleiben sollte.
Du erstellst drei Dateien:
distance.h: Deine Headerdatei, die eine einzelne öffentliche Funktiondistance_squareddeklariert. Diese nimmt vier Ganzzahlen (x1, y1, x2, y2), die zwei Punkte darstellen, und gibt eine Ganzzahl zurück. Verwende Include-Guards mit dem SymbolDISTANCE_H.distance.c: Deine Quelldatei, die die Implementierung enthält. Erstelle einestatic-Hilfsfunktion namenssquare, die eine Ganzzahl entgegennimmt und deren Quadrat zurückgibt. Diese Hilfsfunktion sollte nur innerhalb vondistance.csichtbar sein. Implementiere anschließenddistance_squaredmithilfe deiner statischen Hilfsfunktion, um (x2-x1)² + (y2-y1)² zu berechnen.main.c: Deine Hauptdatei, die den Header einbindet und die öffentliche Funktion verwendet. Die Hilfsfunktionsquaresollte hier nicht zugänglich sein: Nurdistance_squaredist verfügbar.
Die Funktion distance_squared berechnet die quadrierte euklidische Distanz zwischen zwei Punkten. Indem du die Funktion square als static definierst, verbirgst du dieses Implementierungsdetail vor jedem Code außerhalb von distance.c.
Du erhältst vier Ganzzahlen als Eingabe: x1, y1, x2 und y2.
Gib die quadrierte Distanz in diesem Format aus:
Squared distance: {result}Bei den Punkten (0, 0) und (3, 4) würde die Ausgabe beispielsweise so aussehen:
Squared distance: 25Probier es selbst
#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: Rufe distance_squared mit den Eingabekoordinaten auf
// and print the result in the format: "Squared distance: {result}"
return 0;
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der modularen Programmierung
Header-DateienInclude GuardsQuelldateienStatische FunktionenWiederholung: Modularer Taschenrechner4Kapselung
Konzept der Opaque PointersOpaque Structs definierenGetter und SetterValidierung in SetternRückblick: Die geheime Box2Objekte und Methoden
Structs als ObjekteDer 'Self'-PointerConst-CorrectnessPointer vs. WertHilfsmethodenZusammenfassung: Point Manager5Projekt: Einfaches Bankkonto
Projekt-SetupImplementierung des Kontos3Objekt-Lebenszyklus
Konstruktor-MusterDestruktor-MusterStack-InitialisierungTiefe KopieRückblick: String-Wrapper6Vererbung durch Komposition
Struct-EinbettungDie First-Member-RegelZugriff auf Parent-MemberUpcastingRückblick: Formenhierarchie9Projekt: Formen-Zeichner
ProjektübersichtKreis-ImplementierungRechteck-ImplementierungPolymorphe VerwendungShape-ContainerÜbe selbstständig: Online-C-Compiler