Tarihi olarak modülerlik, büyük projeleri bağımsız mantıksal parçalara ayırma yolu olarak ortaya çıktı; bu sayede okunabilirlik, kodun yeniden kullanımı ve geliştiriciler arasındaki sorumluluğun paylaşılması artırıldı. C dilinde modülerlik, dosya düzeyinde — kaynak (.c) ve başlık (.h) dosyaları üzerinden gerçekleştirilir.
Programcıların karşılaştığı problem: kodun parçaları arasındaki etkileşimi nasıl organize edecekleri, tanımlamaların çoğaltılmasından nasıl kaçınacakları, kapsüllemeyi nasıl ihlal etmeyecekleri ve derlemeyi nasıl basitleştirecekleridir.
Çözüm — arayüz ve uygulama ayrımını kullanmaktır:
Modüler kodun yapı örneği:
// mymath.h #ifndef MYMATH_H #define MYMATH_H int add(int, int); #endif // mymath.c #include "mymath.h" int add(int a, int b) { return a + b; } // main.c #include "mymath.h" #include <stdio.h> int main() { printf("%d\n", add(3, 4)); return 0; }
Anahtar özellikler:
Bir başlık dosyasında extern ile bir değişken tanımlamak mümkün müdür ve bunu güvenli bir şekilde birkaç modülde kullanabilir miyiz?
Hayır! Küresel değişkenler sadece bir .c dosyasında tanımlanmalı ve başlık dosyalarında yalnızca extern ile ilan edilmelidir. Aksi takdirde “multiple definition” hatası yüzünden bağlantı hataları meydana gelecektir.
Her başlık dosyasını #include ile yalnızca bir kez dahil etmek zorunlu mudur?
Her .h dosyasını muhafaza makroları (#ifndef/#define/#endif) ile sarmalamak gereklidir; aksi takdirde çoklu dahil etme durumunda ilan çakışmaları ve derleme hataları ortaya çıkacaktır.
C dilinde özel verilerin temiz bir şekilde kapsüllenmesi (opaque pointer) mümkün mü?
Evet. Opaque pointer dediğimiz yapı, kullanıcıdan yapının detaylarını gizlemeyi sağlıyor:
// mystruct.h typedef struct MyStruct MyStruct; MyStruct* create(void); void destroy(MyStruct*); // mystruct.c struct MyStruct { int a; };
Tüm mantık tek bir uzun .c dosyasında gerçekleştirilmiş, kod tekrarı var, küresel değişkenler çakışıyor, bağlantı hataları ortaya çıkıyor.
Artılar:
Eksiler:
Kod modüllere ayrılmış, include guards kullanılmış, özel veriler opaque pointer ile gizlenmiştir.
Artılar:
Eksiler: