2

我正在设计一个包含不透明结构声明的公共接口的库:

lib_public.h

typedef struct lib_struct lib_struct;

void foo(lib_struct *ptr);

void bar(lib_struct *ptr);

opaque 结构隐藏了特定于lib_struct操作系统的实现细节,因此将其直接放入似乎是一个糟糕的设计lib_struct.h。但我仍然想为它编写使用其成员的单元测试。目前我决定创建一个单独的私有头文件,其中只包含结构定义:

lib_struct_linux.h

struct lib_struct{
   int epoll;
   int acceptor_socket;
}

因此,实现lib_struct.c和单元测试lib_struct_test.c将包含此标头,如下所示:

lib_struct.c

#include "lib_struct_linux.h"

//function definition

lib_struct_test.c

#include "lib_struct_linux.h"

//unit tests

lib_struct_linux.h从结构定义在一个私有头文件 ( ) 中,使用该结构的函数在另一个公共头文件 ( lib_public.h)中声明的意义上,这样的设计看起来很混乱。以及在另一个实现文件 ( lib_struct.c) 中的函数定义。

这是常见的方法吗?如果不是,如何以更好的方式设计它。

4

1 回答 1

4

是的,这很好。

事情是这样的设计看起来很混乱,因为结构是在一个私有头文件(lib_struct_linux.h)中定义的,与结构一起工作的函数是在另一个公共头文件(lib_public.h)中声明的。以及在另一个实现文件 ( lib_struct.c) 中的函数定义。

请允许我改写一下:“公共接口位于公共标头中,仅实现声明位于私有标头中,实现位于源文件中。” 听起来一点也不凌乱,事实上,这对我来说听起来是非常好的设计。

于 2019-04-05T07:45:21.583 回答