【发布时间】:2011-05-25 08:07:15
【问题描述】:
在为嵌入式系统编程时,通常绝对不允许使用 malloc()。大多数时候我都可以处理这个问题,但有一件事让我很恼火:它让我无法使用所谓的“不透明类型”来启用数据隐藏。通常我会做这样的事情:
// In file module.h
typedef struct handle_t handle_t;
handle_t *create_handle();
void operation_on_handle(handle_t *handle, int an_argument);
void another_operation_on_handle(handle_t *handle, char etcetera);
void close_handle(handle_t *handle);
// In file module.c
struct handle_t {
int foo;
void *something;
int another_implementation_detail;
};
handle_t *create_handle() {
handle_t *handle = malloc(sizeof(struct handle_t));
// other initialization
return handle;
}
你去吧:create_handle() 执行 malloc() 来创建一个“实例”。一种经常用来避免 malloc() 的构造是像这样更改 create_handle() 的原型:
void create_handle(handle_t *handle);
然后调用者可以这样创建句柄:
// In file caller.c
void i_am_the_caller() {
handle_t a_handle; // Allocate a handle on the stack instead of malloc()
create_handle(&a_handle);
// ... a_handle is ready to go!
}
但是很遗憾这段代码显然是无效的,handle_t的大小是未知的!
我从未真正找到以适当方式解决此问题的解决方案。我很想知道是否有人有这样做的正确方法,或者可能是一种完全不同的方法来启用 C 中的数据隐藏(当然,在 module.c 中不使用静态全局变量,必须能够创建多个实例)。
【问题讨论】:
-
也许我错过了什么。为什么不知道handle_t 的大小? “create_handle”接受一个“handlet_t*”类型的参数,所以它应该知道它的大小。我认为如果你传递一个数组,那将是另一回事。
-
@onemasse 在 caller.c 中不知道 handle_t 的大小,只能使用指向 handle_t 的指针。只有在module.c中才知道handle_t的大小
-
@onemasse 前向声明和指针允许使用不透明类型,以便只有实现知道大小,而不是客户端。
标签: c embedded opaque-pointers