将不透明的结构定义放入单独的头文件中

时间:2019-04-05 07:41:02

标签: c struct software-design opaque-pointers

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

lib_public.h

typedef struct lib_struct lib_struct;

void foo(lib_struct *ptr);

void bar(lib_struct *ptr);

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中定义的,而与该结构一起使用的函数是在另一个公共头文件({{1 }}。并在另一个实现文件(lib_public.h)中定义函数。

这是常见的做法吗?如果没有,怎么可能以更好的方式进行设计。

1 个答案:

答案 0 :(得分:4)

是的,这很好。

  

从某种意义上来说,这样的设计看起来很混乱,因为该结构是在一个私有头文件(lib_struct_linux.h中定义的,而与该结构一起使用的函数是在另一个公共头文件({{1 }}。并在另一个实现文件(lib_public.h)中定义函数。

允许我这样改写:“公共接口在公共头文件中,仅实现的声明在私有头文件中,而实现在源文件中。”听起来一点也不杂乱,实际上,对我来说,这听起来像是完美的设计。