Kaynak Dosyaları
Coddy'nin C Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 3 / 61.
Şu ana kadar, fonksiyon bildirimlerini başlık dosyalarına yerleştirdik, ancak asıl fonksiyon kodu (tanımı) ana dosyada yer aldı. Modüler programlamadaki bir sonraki adım, bu tanımları kendi kaynak dosyalarına (.c dosyaları) taşımaktır.
Bu, temiz bir üç bölümlü yapı oluşturur: başlık dosyası (header) fonksiyonları bildirir, ayrı bir kaynak dosyası bunları tanımlar ve main sadece bunları kullanır. İşte şöyle görünür:
// math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H
int add(int a, int b);
#endif
// math_utils.c
#include "math_utils.h"
int add(int a, int b) {
return a + b;
}
// main.c
#include <stdio.h>
#include "math_utils.h"
int main() {
printf("%d\n", add(5, 3));
return 0;
}
math_utils.c dosyasının kendi başlık dosyasını dahil ettiğine dikkat edin. Bu, fonksiyon tanımının bildirimle eşleşmesini sağlar; eğer eşleşmezlerse, derleyici hatayı yakalayacaktır. Ana dosyanın fonksiyonu kullanmak için sadece başlık dosyasını dahil etmesi yeterlidir; add fonksiyonunun içsel olarak nasıl çalıştığını bilmesine gerek yoktur.
Bu ayrım, uygulama ayrıntılarını gizli tutar ve bu fonksiyonları kullanan dosyalara dokunmadan fonksiyon mantığını değiştirmenize olanak tanır.
Görev
KolayKodunuzu uygun üç dosyalı yapıda düzenleyerek basit bir matematik yardımcı programı oluşturalım: bildirimler için bir başlık (header) dosyası, uygulamalar için bir kaynak (source) dosyası ve bunları kullanan bir ana (main) dosya.
Üç dosya oluşturacaksınız:
math_ops.h: İki işlem için fonksiyon bildirimlerini içeren başlık dosyanız:multiplyvesubtract. Her iki fonksiyon da iki tam sayı alır ve bir tam sayı döndürür.MATH_OPS_Hsembolünü kullanarak koruyucuları (guards) eklemeyi unutmayın.math_ops.c:multiplyvesubtractfonksiyonlarının gerçek uygulamalarını içeren kaynak dosyanız. Bildirimlerin tanımlarla eşleştiğinden emin olmak için bu dosya kendi başlık dosyasını içermelidir.main.c: Başlık dosyasını dahil eden ve hesaplamaları yapmak için her iki fonksiyonu da kullanan ana dosyanız.
multiply fonksiyonu iki tam sayının çarpımını döndürmeli ve subtract fonksiyonu birinci tam sayıdan ikinciyi çıkararak sonucu döndürmelidir.
İki tam sayı girdisi alacaksınız: a ve b.
Ana fonksiyonunuzda, her iki işlemin sonuçlarını ayrı satırlara yazdırın:
Product: {result of multiply}
Difference: {result of subtract}Örneğin, 8 ve 3 girdileriyle çıktı şöyle olacaktır:
Product: 24
Difference: 5Kopya kağıdı
Fonksiyon tanımları, ana dosyadan ayrı kaynak dosyalara (.c dosyaları) taşınabilir ve üç bölümlü modüler bir yapı oluşturulabilir:
- Başlık dosyası (
.h): Fonksiyon bildirimlerini içerir - Kaynak dosyası (
.c): Fonksiyon tanımlarını içerir - Ana dosya (
main.c): Fonksiyonları kullanır
Örnek yapı:
// math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H
int add(int a, int b);
#endif
// math_utils.c
#include "math_utils.h"
int add(int a, int b) {
return a + b;
}
// main.c
#include <stdio.h>
#include "math_utils.h"
int main() {
printf("%d\n", add(5, 3));
return 0;
}
Kaynak dosyası (.c), fonksiyon tanımının bildirimle eşleştiğinden emin olmak için kendi başlık dosyasını içermelidir. Ana dosyanın fonksiyonları kullanmak için yalnızca başlık dosyasını dahil etmesi yeterlidir, böylece uygulama detayları gizli tutulur.
Kendin dene
#include <stdio.h>
#include "math_ops.h"
int main() {
int a, b;
scanf("%d", &a);
scanf("%d", &b);
// TODO: a ve b ile çarpma fonksiyonunu çağırın, sonucu saklayın
// TODO: a ve b ile çıkarma fonksiyonunu çağırın, sonucu saklayın
// TODO: Sonuçları şu formatta yazdırın:
// Product: {çarpma sonucu}
// Difference: {çıkarma sonucu}
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