los enfoques modulares son bastante útiles en general (portátiles y limpios), así que trato de programar módulos lo más independientes posible de cualquier otro módulo. 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 estructura descriptiva) a cualquier función dentro del módulo que se llame.
Ahora mismo, 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 modificarse mediante el uso de las funciones de interfaz proporcionadas
- instancias múltiples
- memoria asignada por el enlazador
Veo las siguientes posibilidades, todas en conflicto con uno de mis objetivos:
declaración global
múltiples instancias, asignadas por el enlazador, pero la estructura no es opaca
(#includes)
module_struct module;
void main(){
module_init(&module);
}
malloc
estructura opaca, varias instancias, pero allcotion on heap
en module.h:
typedef module_struct Module;
en module.c function init, malloc y 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 el módulo
estructura opaca, asignada por el enlazador, solo un número predefinido de instancias
mantenga toda la estructura y la memoria interna 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 combinarlos de alguna manera para la estructura opaca, el vinculador en lugar de la asignación de almacenamiento dinámico y múltiples / cualquier número de instancias?
resolución
como se propone en algunas respuestas a continuación, creo que la mejor manera es:
- reserva espacio para los módulos MODULE_MAX_INSTANCE_COUNT en el archivo fuente de los módulos
- no define MODULE_MAX_INSTANCE_COUNT en el módulo mismo
- 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 que se desean para la aplicación
- al inicializar una instancia, devuelva la dirección de memoria (* void) de la estructura de destino o el índice de módulos (lo que más le guste)