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

St.*_*rio 2 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);
Run Code Online (Sandbox Code Playgroud)

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

lib_struct_linux.h:

struct lib_struct{
   int epoll;
   int acceptor_socket;
}
Run Code Online (Sandbox Code Playgroud)

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

lib_struct.c:

#include "lib_struct_linux.h"

//function definition
Run Code Online (Sandbox Code Playgroud)

lib_struct_test.c:

#include "lib_struct_linux.h"

//unit tests
Run Code Online (Sandbox Code Playgroud)

问题是这样的设计看起来很混乱,因为结构体是在一个私有头文件(lib_struct_linux.h)中定义的,而使用该结构体的函数是在另一个公共头文件(lib_public.h)中声明的。函数的定义在另一个实现文件(lib_struct.c)中。

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

Rei*_*ica 5

是的,这完全没问题。

问题是这样的设计看起来很混乱,因为结构体是在一个私有头文件(lib_struct_linux.h)中定义的,而使用该结构体的函数是在另一个公共头文件(lib_public.h)中声明的。函数的定义在另一个实现文件(lib_struct.c)中。

请允许我重新表述一下:“公共接口位于公共标头中,仅实现的声明位于私有标头中,实现位于源文件中。” 听起来一点也不乱,事实上,对我来说这听起来是完美的设计。