as abordagens modulares são bastante úteis em geral (portáteis e limpas), por isso tento programar os módulos o mais independente possível de qualquer outro módulo. A maioria das minhas abordagens é baseada em uma estrutura que descreve o próprio módulo. Uma função de inicialização define os parâmetros principais, depois um manipulador (ponteiro para estrutura descritiva) é passado para qualquer função dentro do módulo que é chamada.
No momento, estou imaginando qual pode ser a melhor abordagem de memória de alocação para a estrutura que descreve um módulo. Se possível, eu gostaria do seguinte:
- Estrutura opaca, portanto, a estrutura só pode ser alterada pelo uso das funções de interface fornecidas
- Várias instâncias
- memória alocada pelo vinculador
Vejo as seguintes possibilidades, que todas conflitam com um dos meus objetivos:
declaração global
várias instâncias, todas citadas pelo vinculador, mas struct não é opaco
(#includes)
module_struct module;
void main(){
module_init(&module);
}
malloc
estrutura opaca, várias instâncias, mas allcotion no heap
no module.h:
typedef module_struct Module;
na função module.c init, malloc e retorne o ponteiro para a memória alocada
module_mem = malloc(sizeof(module_struct ));
/* initialize values here */
return module_mem;
em main.c
(#includes)
Module *module;
void main(){
module = module_init();
}
declaração no módulo
estrutura opaca, alocada pelo vinculador, apenas um número predefinido de instâncias
mantenha toda a estrutura e memória internas ao módulo e nunca exponha um manipulador ou estrutura.
(#includes)
void main(){
module_init(_no_param_or_index_if_multiple_instances_possible_);
}
Existe uma opção para combiná-los de alguma forma para estrutura opaca, vinculador em vez de alocação de heap e várias / várias instâncias?
solução
como proposto em algumas respostas abaixo, acho que a melhor maneira é:
- reservar espaço para os módulos MODULE_MAX_INSTANCE_COUNT no arquivo de origem dos módulos
- não defina MODULE_MAX_INSTANCE_COUNT no próprio módulo
- adicione um #ifndef MODULE_MAX_INSTANCE_COUNT #error ao arquivo de cabeçalho dos módulos para garantir que o usuário dos módulos esteja ciente dessa limitação e defina o número máximo de instâncias desejadas para o aplicativo
- na inicialização de uma instância, retorne o endereço de memória (* void) da estrutura dessecetiva ou o índice de módulos (o que você quiser mais)