Statik Fonksiyonlar
Coddy'nin C Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 4 / 61.
Kodu birden fazla dosyaya böldüğünüzde, bir kaynak dosyada tanımlanan her fonksiyon varsayılan olarak diğer dosyalar tarafından görülebilir. Ancak bazen sadece dahili olarak kullanılması gereken yardımcı fonksiyonlara ihtiyaç duyarsınız; diğer dosyaların erişmemesi, hatta hakkında bilgi sahibi bile olmaması gereken fonksiyonlar.
static anahtar kelimesi, bir fonksiyona uygulandığında, görünürlüğünü tanımlandığı dosya ile sınırlandırır. Bu, birisi onu bildirmeye çalışsa bile diğer kaynak dosyalardan çağrılamayan özel bir fonksiyon oluşturur.
// math_utils.c
#include "math_utils.h"
// Özel yardımcı - sadece bu dosyada görünür
static int square(int x) {
return x * x;
}
// Genel fonksiyon - main.c dosyasından çağrılabilir
int sum_of_squares(int a, int b) {
return square(a) + square(b);
}
Bu örnekte, sum_of_squares başlık dosyasında bildirilmiştir ve her yerde kullanılabilir. Ancak, square static olarak işaretlenmiştir, bu nedenle sadece math_utils.c içinde mevcuttur. Eğer main.c doğrudan square() fonksiyonunu çağırmaya çalışırsa, bağlayıcı (linker) bir hata üretecektir—fonksiyon basitçe dosyası dışında mevcut değildir.
Bu, C'nin dosya düzeyinde kapsülleme (encapsulation) sağlama yöntemidir. Static fonksiyonlar, uygulama detaylarını gizlemenize olanak tanıyarak, dahili olarak ihtiyaç duyduğunuz her türlü yardımcı mantığı kullanırken genel arayüzünüzü temiz tutmanızı sağlar.
Görev
KolayBir sayının karesini hesaplamak için özel bir yardımcı fonksiyon kullanan bir mesafe hesaplayıcı oluşturalım; bu, programınızın geri kalanından gizli kalması gereken bir ayrıntıdır.
Üç dosya oluşturacaksınız:
distance.h: İki noktayı temsil eden dört tam sayı (x1, y1, x2, y2) alan ve bir tam sayı döndüren tek bir genel fonksiyon olandistance_squaredfonksiyonunu bildiren başlık dosyanız.DISTANCE_Hsembolünü kullanarak include guard yapılarını dahil edin.distance.c: Uygulamayı içeren kaynak dosyanız. Bir tam sayı alan ve karesini döndürensquareadındastaticbir yardımcı fonksiyon oluşturun. Bu yardımcı fonksiyon yalnızcadistance.ciçinde görünür olmalıdır. Ardından, (x2-x1)² + (y2-y1)² değerini hesaplamak için statik yardımcı fonksiyonunuzu kullanarakdistance_squaredfonksiyonunu uygulayın.main.c: Başlık dosyasını dahil eden ve genel fonksiyonu kullanan ana dosyanız.squareyardımcı fonksiyonuna buradan erişilememelidir; yalnızcadistance_squaredkullanılabilir olmalıdır.
distance_squared fonksiyonu, iki nokta arasındaki karesel Öklid mesafesini hesaplar. square fonksiyonunu statik tutarak, bu uygulama detayını distance.c dışındaki tüm kodlardan gizlemiş olursunuz.
Dört tam sayı girişi alacaksınız: x1, y1, x2 ve y2.
Karesel mesafeyi şu formatta yazdırın:
Squared distance: {result}Örneğin, (0, 0) ve (3, 4) noktaları için çıktı şöyle olacaktır:
Squared distance: 25Kopya kağıdı
static anahtar kelimesi, bir fonksiyonun görünürlüğünü tanımlandığı dosya ile sınırlandırarak, diğer kaynak dosyalardan çağrılamayan özel bir fonksiyon oluşturur.
// Özel yardımcı - sadece bu dosyada görünür
static int square(int x) {
return x * x;
}
// Genel fonksiyon - diğer dosyalardan çağrılabilir
int sum_of_squares(int a, int b) {
return square(a) + square(b);
}
Statik fonksiyonlar dosya düzeyinde kapsülleme sağlayarak, genel arayüzünüzü temiz tutarken uygulama ayrıntılarını gizlemenize olanak tanır.
Kendin dene
#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: Giriş koordinatlarıyla distance_squared fonksiyonunu çağırın
// ve sonucu şu formatta yazdırın: "Squared distance: {result}"
return 0;
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Object Oriented Programming bölümündeki tüm dersler
1Modüler Programlama Temelleri
Başlık DosyalarıInclude Guard'larKaynak DosyalarıStatik FonksiyonlarÖzet: Modüler Hesap Makinesi4Kapsülleme
Opaque Pointer KavramıOpaque Struct TanımlamaGetter ve Setter MetotlarıSetter Metotlarında DoğrulamaÖzet: Gizli Kutu2Nesneler ve Metotlar
Nesne Olarak Struct'lar'Self' İşaretçisiConst Doğruluğuİşaretçi vs DeğerYardımcı MetotlarÖzet: Point Manager5Proje: Basit Banka Hesabı
Proje KurulumuHesabın Oluşturulması3Nesne Yaşam Döngüsü
Constructor DeseniDestructor DeseniStack İlklendirmeDerin KopyalamaÖzet: String Wrapper6Kompozisyon Yoluyla Kalıtım
Struct Gömmeİlk Üye KuralıÜst Üyelere ErişimUpcastingÖzet: Şekil Hiyerarşisi