modüler yaklaşımlar genel olarak oldukça kullanışlı (taşınabilir ve temiz), bu yüzden modülleri mümkün olduğunca diğer modüllerden bağımsız olarak programlamaya çalışıyorum. Çoğu yaklaşım modülün kendisini tanımlayan bir yapıya dayanır. Bir başlatma işlevi birincil parametreleri ayarlar, daha sonra modül içindeki herhangi bir işleve bir işleyici (tanımlayıcı yapıya işaretçi) aktarılır.
Şu anda, bir modülü tanımlayan yapı için en iyi bellek ayırma yaklaşımının ne olabileceğini merak ediyorum. Mümkünse aşağıdakileri istiyorum:
- Opak yapı, bu nedenle yapı yalnızca sağlanan arayüz işlevlerinin kullanılmasıyla değiştirilebilir.
- Birden fazla örnek
- bağlayıcı tarafından ayrılan bellek
Hedeflerimden biriyle çelişen şu olasılıkları görüyorum:
küresel deklarasyon
bağlayıcı tarafından kodlanan birden çok örnek, ancak yapı opak değil
(#includes)
module_struct module;
void main(){
module_init(&module);
}
malloc
opak yapı, çoklu örnekler, ancak yığın üzerindeki allcotion
module.h dosyasında:
typedef module_struct Module;
module.c init işlevinde, malloc ve pointer için ayrılmış belleğe dön
module_mem = malloc(sizeof(module_struct ));
/* initialize values here */
return module_mem;
main.c'de
(#includes)
Module *module;
void main(){
module = module_init();
}
modülde bildirim
opak yapı, bağlayıcı tarafından tahsis edildi, sadece önceden tanımlanmış sayıda örnek
tüm yapıyı ve hafızayı modülün içinde saklayın ve asla bir işleyici veya yapı göstermeyin.
(#includes)
void main(){
module_init(_no_param_or_index_if_multiple_instances_possible_);
}
Bunları bir şekilde opak yapı, yığın tahsisi yerine bağlayıcı ve çoklu / herhangi bir sayıda örnek için birleştirme seçeneği var mı?
çözüm
aşağıdaki bazı cevaplarda önerildiği gibi, bence en iyi yol:
- modüller kaynak dosyasındaki MODULE_MAX_INSTANCE_COUNT modül için yer ayırın
- Modülde kendisinde MODULE_MAX_INSTANCE_COUNT tanımlamayın
- modüller kullanıcısının bu sınırlamanın farkında olduğundan ve uygulama için istenen maksimum örnek sayısını tanımladığından emin olmak için modüller başlık dosyasına bir #ifndef MODULE_MAX_INSTANCE_COUNT #error ekleyin
- bir örneğin başlatılması üzerine, açıklayıcı yapının bellek adresini (* geçersiz) veya modüller dizinini (daha fazla ne isterseniz) döndürün