Los enfoques modulares son bastante útiles en general (portátiles y limpios), por lo que trato de programar los módulos de la forma más independiente posible. La mayoría de mis enfoques se basan en una estructura que describe el módulo en sí. Una función de inicialización establece los parámetros primarios, luego se pasa un controlador (puntero a la estructura descriptiva) a cualquier función dentro del módulo que se llame.
En este momento, me pregunto cuál puede ser el mejor enfoque de la memoria de asignación para la estructura que describe un módulo. Si es posible, me gustaría lo siguiente:
- Estructura opaca, por lo que la estructura solo puede alterarse mediante el uso de funciones de interfaz proporcionadas
- Múltiples instancias
- memoria asignada por el enlazador
Veo las siguientes posibilidades, que todos entran en conflicto con uno de mis objetivos:
declaración global
múltiples instancias, todas citadas por el enlazador, pero struct no es opaco
(#includes)
module_struct module;
void main(){
module_init(&module);
}
malloc
estructura opaca, múltiples instancias, pero allcotion en el montón
en module.h:
typedef module_struct Module;
en la función init module.c, malloc y el puntero de retorno a la memoria asignada
module_mem = malloc(sizeof(module_struct ));
/* initialize values here */
return module_mem;
en main.c
(#includes)
Module *module;
void main(){
module = module_init();
}
declaración en módulo
estructura opaca, asignada por el vinculador, solo un número predefinido de instancias
mantenga toda la estructura y la memoria internas del módulo y nunca exponga un controlador o estructura.
(#includes)
void main(){
module_init(_no_param_or_index_if_multiple_instances_possible_);
}
¿Existe una opción para combinar estos de alguna manera para estructura opaca, enlazador en lugar de asignación de montón y múltiples / cualquier número de instancias?
solución
Como se propone en algunas respuestas a continuación, creo que la mejor manera es:
- reservar espacio para módulos MODULE_MAX_INSTANCE_COUNT en el archivo fuente de módulos
- no defina MODULE_MAX_INSTANCE_COUNT en el módulo en sí
- agregue un #ifndef MODULE_MAX_INSTANCE_COUNT #error al archivo de encabezado de los módulos para asegurarse de que el usuario de los módulos esté al tanto de esta limitación y defina el número máximo de instancias deseadas para la aplicación
- en la inicialización de una instancia, devuelva la dirección de memoria (* void) de la estructura descriptiva o el índice de módulos (lo que quiera más)