Statische Funktionen
Teil des Abschnitts Object Oriented Programming der C-Journey von Coddy — Lektion 4 von 61.
Wenn Sie Code auf mehrere Dateien aufteilen, ist jede in einer Quelldatei definierte Funktion standardmäßig für andere Dateien sichtbar. Aber manchmal benötigen Sie Hilfsfunktionen, die nur intern verwendet werden sollten – Funktionen, auf die andere Dateien nicht zugreifen oder von denen sie nicht einmal 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. Dies erzeugt 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"
// Private Hilfsfunktion - 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 ist sum_of_squares im Header deklariert und kann überall verwendet werden. Jedoch ist square als static markiert, daher existiert sie nur innerhalb von math_utils.c. Wenn main.c versucht, square() direkt aufzurufen, wird der Linker einen Fehler erzeugen – die Funktion existiert außerhalb ihrer Datei schlichtweg nicht.
Dies ist die Art und Weise, wie C Kapselung auf Dateiebene erreicht. Statische Funktionen ermöglichen es Ihnen, Implementierungsdetails zu verbergen, wodurch Ihre öffentliche Schnittstelle sauber bleibt, während Sie intern die benötigte Hilfslogik verwenden.
Aufgabe
EinfachLassen Sie uns einen Distanzrechner bauen, der eine private Hilfsfunktion verwendet, um das Quadrat einer Zahl zu berechnen – ein Detail, das vor dem Rest Ihres Programms verborgen bleiben sollte.
Sie werden drei Dateien erstellen:
distance.h: Ihre Header-Datei, die eine einzelne öffentliche Funktiondistance_squareddeklariert, die vier Ganzzahlen (x1, y1, x2, y2) entgegennimmt, welche zwei Punkte darstellen, und eine Ganzzahl zurückgibt. Verwenden Sie Include-Guards mit dem SymbolDISTANCE_H.distance.c: Ihre Quelldatei, die die Implementierung enthält. Erstellen Sie einestaticHilfsfunktion namenssquare, die eine Ganzzahl entgegennimmt und deren Quadrat zurückgibt. Diese Hilfsfunktion sollte nur innerhalb vondistance.csichtbar sein. Implementieren Sie danndistance_squaredunter Verwendung Ihrer statischen Hilfsfunktion, um (x2-x1)² + (y2-y1)² zu berechnen.main.c: Ihre 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 Sie die Funktion square statisch halten, verbergen Sie dieses Implementierungsdetail vor jeglichem Code außerhalb von distance.c.
Sie erhalten vier Ganzzahl-Eingaben: x1, y1, x2 und y2.
Geben Sie die quadrierte Distanz in diesem Format aus:
Squared distance: {result}Zum Beispiel wäre bei den Punkten (0, 0) und (3, 4) die Ausgabe:
Squared distance: 25Spickzettel
Das Schlüsselwort static beschränkt die Sichtbarkeit einer Funktion auf die Datei, in der sie definiert ist, wodurch eine private Funktion erstellt wird, die nicht aus anderen Quelldateien aufgerufen werden kann.
// Privater Helfer - nur in dieser Datei sichtbar
static int square(int x) {
return x * x;
}
// Öffentliche Funktion - kann aus anderen Dateien aufgerufen werden
int sum_of_squares(int a, int b) {
return square(a) + square(b);
}
Statische Funktionen bieten Kapselung auf Dateiebene, was es Ihnen ermöglicht, Implementierungsdetails zu verbergen, während Ihre öffentliche Schnittstelle sauber bleibt.
Probier 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 eingegebenen Koordinaten auf
// und gib das Ergebnis im Format "Squared distance: {result}" aus
return 0;
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Object Oriented Programming
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-Implementierung