我甚至不确定如何恰当地提出有关此事的问题。
我正在编写一个库,我有多个实现(多个库中的一个)。我想尽可能地隐藏来自客户端应用程序的实现细节(如果不是全部的话),以便编写应用程序而忽略实现细节。
当实现包含在一个函数中时,一切都很好。但是,我经常需要从库中实例化一个结构,使用库中的函数对其执行某些操作,继续正常编写应用程序,然后使用库中先前函数的数据从库中返回函数。
结构细节仅对库函数很重要。我不需要看到或触摸客户端应用程序中的那些,除非因此而传递它们。
那么,有没有办法从客户端应用程序隐藏结构细节,仍然能够使用它,或者是否有另一种方式通过某种形式的封装或甚至某种类型的数据(全局变量? )只对图书馆可见?
这是我的蹩脚插图示例,代码为:
/*
library_private.h
*/
#if (A)
{
struct mystruct_t {
A *something;
}
}
#else
struct mystruct_t {
B *something;
}
#endif
/*
library_public.h
*/
struct mystruct_t;
/*
library.c
*/
struct mystruct_t* create() {
struct mystruct_t *handle = malloc(sizeof(struct mystruct_t));
return handle;
}
/*
client.h
*/
struct mystruct_t;
/* but, I need a definition, so I have to repeat either from library_private.h */
/*
client.c
*/
int main(int argc, char const *argv[]) {
struct mystruct_t *handle = create();
/*...*/
something(handle);
return 0;
}
答案 0 :(得分:0)
返回时转换为void *,并在传入函数后返回结构mystruct_t。这不是很好,因为你将失去一些编译器类型检查。
答案 1 :(得分:0)
client.c
(或client.h
)应包含library_public.h
。没有必要具有结构定义。只有它的声明struct mystruct_t;
足以使用指向结构的指针。当然,您无法访问其成员,但在这种情况下,这正是您想要的。