将不透明结构定义放入单独的 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." 听起来一点也不乱,事实上,对我来说这听起来是个完美的设计。
我正在设计一个带有 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." 听起来一点也不乱,事实上,对我来说这听起来是个完美的设计。