Pendekatan modular pada umumnya cukup praktis (portabel dan bersih), jadi saya mencoba memprogram modul yang terpisah dari modul lainnya. Sebagian besar pendekatan saya didasarkan pada sebuah struct yang menggambarkan modul itu sendiri. Fungsi inisialisasi menetapkan parameter utama, kemudian pawang (pointer ke struct deskriptif) dilewatkan ke fungsi apa pun di dalam modul yang disebut.
Saat ini, saya bertanya-tanya apa pendekatan terbaik alokasi memori untuk struct yang menggambarkan modul. Jika memungkinkan, saya ingin yang berikut ini:
- Struct buram, sehingga struct hanya dapat diubah oleh penggunaan fungsi antarmuka yang disediakan
- Banyak contoh
- memori yang dialokasikan oleh tautan
Saya melihat kemungkinan berikut, bahwa semua bertentangan dengan salah satu tujuan saya:
deklarasi global
banyak contoh, dialihkan oleh tautan, tetapi struct tidak buram
(#includes)
module_struct module;
void main(){
module_init(&module);
}
malloc
struct buram, beberapa contoh, tetapi semua ramuan di tumpukan
dalam module.h:
typedef module_struct Module;
dalam fungsi module.c init, malloc dan mengembalikan pointer ke memori yang dialokasikan
module_mem = malloc(sizeof(module_struct ));
/* initialize values here */
return module_mem;
di main.c
(#includes)
Module *module;
void main(){
module = module_init();
}
deklarasi dalam modul
struct buram, dialokasikan oleh linker, hanya jumlah instance yang telah ditentukan
menjaga seluruh struct dan memori internal ke modul dan tidak pernah mengekspos handler atau struct.
(#includes)
void main(){
module_init(_no_param_or_index_if_multiple_instances_possible_);
}
Apakah ada opsi untuk menggabungkan ini entah bagaimana untuk struct buram, linker alih-alih alokasi tumpukan dan beberapa / jumlah instance?
larutan
seperti yang diusulkan dalam beberapa jawaban di bawah ini, saya pikir cara terbaik adalah:
- cadangan ruang untuk MODULE_MAX_INSTANCE_COUNT modul dalam file sumber modul
- jangan mendefinisikan MODULE_MAX_INSTANCE_COUNT dalam modul itu sendiri
- tambahkan #ifndef MODULE_MAX_INSTANCE_COUNT #error ke file header modul untuk memastikan pengguna modul mengetahui batasan ini dan menentukan jumlah instance maksimum yang diinginkan untuk aplikasi
- pada inisialisasi instance, kembalikan alamat memori (* void) dari struct desricptive atau indeks modul (apa pun yang Anda suka)