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)中。
这是常见的方法吗?如果不是,如何才能以更好的方式设计它。
是的,这完全没问题。
问题是这样的设计看起来很混乱,因为结构体是在一个私有头文件(
lib_struct_linux.h)中定义的,而使用该结构体的函数是在另一个公共头文件(lib_public.h)中声明的。函数的定义在另一个实现文件(lib_struct.c)中。
请允许我重新表述一下:“公共接口位于公共标头中,仅实现的声明位于私有标头中,实现位于源文件中。” 听起来一点也不乱,事实上,对我来说这听起来是完美的设计。