【发布时间】:2014-02-13 00:08:09
【问题描述】:
我见过很多 C 库,它们不会将它们在内部处理的对象表示为不同的类型,而是在让您访问它们之前用 void 指针包装它们。在实践中,“私有”源文件看起来像:
typedef struct {
int value;
} object;
void * object_new(void)
{
object *o = malloc(sizeof(object));
o->value = 1;
return o;
}
int object_get(void *o)
{
return (object *)o->value;
}
void * object_free(void *o)
{
free(o);
}
在主标题中你只有:
void * object_new(void);
int object_get(void *o);
void * object_free(void *o);
现在我想知道:他们这样做有什么特别的原因吗?如果想法是确保 API 用户无法访问对象的内部,那么仅在主库标头中公开类型名称并隐藏底层结构的细节(或其他任何内容)是否足够?实际对象)在实现文件中?
【问题讨论】:
-
你知道有什么开源库可以做到这一点吗?我对这种模式很好奇,如果有真实世界的例子可供参考,那就太好了。
-
这个数据库库,例如:github.com/pmwkaa/sophia。它只公开常量,并且它在内部处理的三个主要对象(数据库、游标和“环境”)只能通过 void 指针访问,尽管它们在实现中适当地进行了类型定义。
-
@MBlanc GLib 很大