gli approcci modulari sono piuttosto utili in generale (portatili e puliti), quindi provo a programmare moduli il più indipendenti possibile da qualsiasi altro modulo. La maggior parte dei miei approcci si basa su una struttura che descrive il modulo stesso. Una funzione di inizializzazione imposta i parametri primari, successivamente un gestore (puntatore alla struttura descrittiva) viene passato a qualsiasi funzione all'interno del modulo viene chiamata.
In questo momento, mi chiedo quale potrebbe essere l'approccio migliore della memoria di allocazione per la struttura che descrive un modulo. Se possibile, vorrei quanto segue:
- Struct opaca, quindi la struct può essere modificata solo mediante l'uso delle funzioni di interfaccia fornite
- Istanze multiple
- memoria allocata dal linker
Vedo le seguenti possibilità, tutte in conflitto con uno dei miei obiettivi:
dichiarazione globale
istanze multiple, assegnate dal linker, ma struct non è opaco
(#includes)
module_struct module;
void main(){
module_init(&module);
}
malloc
struttura opaca, istanze multiple, ma allcotion su heap
nel modulo.h:
typedef module_struct Module;
nella funzione module.c init, malloc e restituisce il puntatore alla memoria allocata
module_mem = malloc(sizeof(module_struct ));
/* initialize values here */
return module_mem;
in main.c
(#includes)
Module *module;
void main(){
module = module_init();
}
dichiarazione nel modulo
struttura opaca, allocata dal linker, solo un numero predefinito di istanze
mantenere l'intera struttura e la memoria interne al modulo e non esporre mai un gestore o una struttura.
(#includes)
void main(){
module_init(_no_param_or_index_if_multiple_instances_possible_);
}
Esiste un'opzione per combinarli in qualche modo per una struttura opaca, un linker invece dell'allocazione dell'heap e più / un numero qualsiasi di istanze?
soluzione
come proposto in alcune risposte di seguito, penso che il modo migliore sia:
- riservare spazio per i moduli MODULE_MAX_INSTANCE_COUNT nel file di origine dei moduli
- non definire MODULE_MAX_INSTANCE_COUNT nel modulo stesso
- aggiungere un #ifndef MODULE_MAX_INSTANCE_COUNT #error al file di intestazione dei moduli per assicurarsi che l'utente dei moduli sia a conoscenza di questa limitazione e definisca il numero massimo di istanze desiderate per l'applicazione
- all'inizializzazione di un'istanza restituisci l'indirizzo di memoria (* vuoto) della struttura distruttiva o l'indice dei moduli (qualunque cosa ti piaccia di più)