模块化方法通常非常方便(便携且干净),因此我尝试将模块编程为尽可能独立于任何其他模块。我的大多数方法都基于描述模块本身的结构。初始化函数设置主要参数,然后将处理程序(指向描述结构的指针)传递给模块内被调用的任何函数。
现在,我想知道为描述模块的结构分配内存的最佳方法可能是什么。如果可能的话,我想要以下内容:
- 不透明结构,因此只能通过使用提供的接口函数来更改结构
- 多个实例
- 链接器分配的内存
我看到以下可能性,所有这些都与我的目标之一相冲突:
全球宣言
多个实例,由链接器分配,但结构不是不透明的
(#includes)
module_struct module;
void main(){
module_init(&module);
}
malloc
不透明的结构,多个实例,但堆上的 allcotion
在 module.h 中:
typedef module_struct Module;
在 module.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) 或模块索引(无论您更喜欢什么)