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

Putting opaque struct definition into a separate header file

我正在设计一个带有 public 接口的库,其中包含不透明的结构声明:

lib_public.h:

typedef struct lib_struct lib_struct;

void foo(lib_struct *ptr);

void bar(lib_struct *ptr);

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

lib_struct_linux.h:

struct lib_struct{
   int epoll;
   int acceptor_socket;
}

所以实现 lib_struct.c 以及单元测试 lib_struct_test.c 将包括这个 header 如下:

lib_struct.c:

#include "lib_struct_linux.h"

//function definition

lib_struct_test.c:

#include "lib_struct_linux.h"

//unit tests

从某种意义上说,这样的设计似乎很混乱,因为该结构是在一个私有 header 文件 (lib_struct_linux.h) 中定义的,使用该结构的函数是在另一个 public header 文件 (lib_public.h)。以及另一个实现文件中的函数定义 (lib_struct.c)。

这是常见的做法吗?如果不是,怎么可能设计得更好

是的,这很好。

The thing is such a design seems messy in the sense that the struct is defined in one private header file (lib_struct_linux.h), the functions to work with the struct are declared in another public header file (lib_public.h). And the definition of the functions in yet another implementation file (lib_struct.c).

请允许我改写一下:"The public interface is in a public header, the implementation-only declarations are in a private header, and implementation is in a source file." 听起来一点也不乱,事实上,对我来说这听起来是个完美的设计。