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