传递数据时隐藏实现细节

时间:2016-09-22 21:31:41

标签: c struct

我甚至不确定如何恰当地提出有关此事的问题。

我正在编写一个库,我有多个实现(多个库中的一个)。我想尽可能地隐藏来自客户端应用程序的实现细节(如果不是全部的话),以便编写应用程序而忽略实现细节。

当实现包含在一个函数中时,一切都很好。但是,我经常需要从库中实例化一个结构,使用库中的函数对其执行某些操作,继续正常编写应用程序,然后使用库中先前函数的数据从库中返回函数。

结构细节仅对库函数很重要。我不需要看到或触摸客户端应用程序中的那些,除非因此而传递它们。

那么,有没有办法从客户端应用程序隐藏结构细节,仍然能够使用它,或者是否有另一种方式通过某种形式的封装或甚至某种类型的数据(全局变量? )只对图书馆可见?

这是我的蹩脚插图示例,代码为:

/*
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;
}

2 个答案:

答案 0 :(得分:0)

返回时转换为void *,并在传入函数后返回结构mystruct_t。这不是很好,因为你将失去一些编译器类型检查。

答案 1 :(得分:0)

client.c(或client.h)应包含library_public.h。没有必要具有结构定义。只有它的声明struct mystruct_t;足以使用指向结构的指针。当然,您无法访问其成员,但在这种情况下,这正是您想要的。