Модульные подходы в целом довольно удобны (переносимы и чисты), поэтому я стараюсь программировать модули как можно более независимо от любых других модулей. Большинство моих подходов основаны на структуре, которая описывает сам модуль. Функция инициализации устанавливает первичные параметры, после чего обработчик (указатель на дескриптивную структуру) передается любой вызываемой функции внутри модуля.
Сейчас мне интересно, каков наилучший подход к распределению памяти для структуры, описывающей модуль. Если возможно, я бы хотел следующее:
- Непрозрачная структура, поэтому структура может быть изменена только с использованием предоставленных интерфейсных функций
- Несколько экземпляров
- память, выделенная компоновщиком
Я вижу следующие возможности, которые все противоречат одной из моих целей:
глобальная декларация
несколько экземпляров, все ссылки на компоновщик, но структура не непрозрачна
(#includes)
module_struct module;
void main(){
module_init(&module);
}
таНос
непрозрачная структура, несколько экземпляров, но все в куче
в module.h:
typedef module_struct Module;
в модуле init.c функция malloc и возврат указателя на выделенную память
module_mem = malloc(sizeof(module_struct ));
/* initialize values here */
return module_mem;
в main.c
(#includes)
Module *module;
void main(){
module = module_init();
}
объявление в модуле
непрозрачная структура, выделенная компоновщиком, только заранее определенное количество экземпляров
храните всю структуру и память внутри модуля и никогда не открывайте обработчик или структуру.
(#includes)
void main(){
module_init(_no_param_or_index_if_multiple_instances_possible_);
}
Есть ли возможность объединить их как-то для непрозрачной структуры, компоновщика вместо выделения кучи и нескольких / любого количества экземпляров?
решение
как предложено в некоторых ответах ниже, я думаю, что лучший способ заключается в следующем:
- резервное пространство для модулей MODULE_MAX_INSTANCE_COUNT в исходном файле модулей
- не определяйте MODULE_MAX_INSTANCE_COUNT в самом модуле
- добавьте #ifndef MODULE_MAX_INSTANCE_COUNT #error в заголовочный файл модулей, чтобы убедиться, что пользователь модулей знает об этом ограничении и определяет максимальное количество экземпляров, требуемых для приложения.
- при инициализации экземпляра вернуть либо адрес памяти (* void) описательной структуры, либо индекс модулей (что вам больше нравится)