具有一些私有操作的不透明结构
Opaque struct that has some private operations
我正在设计一个库,遇到了一个关于将 public 和库私有的操作分开的问题。我有以下库界面:
libmylib.h
:
typedef struct lib_context lib_context;
int init_library_context(const char **paths,
size_t path_num,
lib_context **ctx_out);
void release_context(lib_context *ctx);
出于测试目的,我想提供一个为单元测试中使用的不透明结构分配内存的函数。但是由于客户不需要这个函数,我决定将其设为私有(并将结构的定义也放在那里):
lib_context_internal.h
:
//the definition is simplified for brevity sake
struct lib_context{
size_t paths_num;
const char *path[];
};
lib_context * allocate_context(size_t paths_num);
但是libmylib.c
中提供了函数的定义(没有lib_context_internal.c
文件):
libmylib.c
:
#include "limylib.h"
#include "lib_context_internal.h"
lib_context * allocate_context(size_t paths_num){
size_t size = sizeof(struct lib_context) + sizeof(const char *[paths_num]);
return calloc(1, size);
}
void release_context(lib_context *ctx){
//release all strings in the lib_ctx
free(ctx);
}
int init_library_context(const char **paths,
size_t path_num,
lib_context **ctx_out){
//open sockets, init epoll, etc...
*ctx_out = allocate_context(paths_num);
return 0;
}
困扰我的是,我将与同一数据结构相关的 allocation/deallocation 函数放在不同的 headers 中(即使)我在同一个 .c
文件中定义了它们。这样做不是很常见吗?
像这样有一个单独的 header 很好。如果您的库中的其他实现文件碰巧需要访问那里定义的类型或函数,那么它们也可以包含 header。只要内部 header 不随编译库分发,就没问题。
我要做的一件事是将 public header 包含在私有 header 中。这样实现文件只需要担心包含私有 header.
lib_context_internal.h:
#include "limylib.h"
//the definition is simplified for brevity sake
struct lib_context{
size_t paths_num;
const char *path[];
};
lib_context * allocate_context(size_t paths_num);
libmylib.c:
#include "lib_context_internal.h"
lib_context * allocate_context(size_t paths_num){
size_t size = sizeof(struct lib_context) + sizeof(const char *[paths_num]);
return calloc(1, size);
}
...
我正在设计一个库,遇到了一个关于将 public 和库私有的操作分开的问题。我有以下库界面:
libmylib.h
:
typedef struct lib_context lib_context;
int init_library_context(const char **paths,
size_t path_num,
lib_context **ctx_out);
void release_context(lib_context *ctx);
出于测试目的,我想提供一个为单元测试中使用的不透明结构分配内存的函数。但是由于客户不需要这个函数,我决定将其设为私有(并将结构的定义也放在那里):
lib_context_internal.h
:
//the definition is simplified for brevity sake
struct lib_context{
size_t paths_num;
const char *path[];
};
lib_context * allocate_context(size_t paths_num);
但是libmylib.c
中提供了函数的定义(没有lib_context_internal.c
文件):
libmylib.c
:
#include "limylib.h"
#include "lib_context_internal.h"
lib_context * allocate_context(size_t paths_num){
size_t size = sizeof(struct lib_context) + sizeof(const char *[paths_num]);
return calloc(1, size);
}
void release_context(lib_context *ctx){
//release all strings in the lib_ctx
free(ctx);
}
int init_library_context(const char **paths,
size_t path_num,
lib_context **ctx_out){
//open sockets, init epoll, etc...
*ctx_out = allocate_context(paths_num);
return 0;
}
困扰我的是,我将与同一数据结构相关的 allocation/deallocation 函数放在不同的 headers 中(即使)我在同一个 .c
文件中定义了它们。这样做不是很常见吗?
像这样有一个单独的 header 很好。如果您的库中的其他实现文件碰巧需要访问那里定义的类型或函数,那么它们也可以包含 header。只要内部 header 不随编译库分发,就没问题。
我要做的一件事是将 public header 包含在私有 header 中。这样实现文件只需要担心包含私有 header.
lib_context_internal.h:
#include "limylib.h"
//the definition is simplified for brevity sake
struct lib_context{
size_t paths_num;
const char *path[];
};
lib_context * allocate_context(size_t paths_num);
libmylib.c:
#include "lib_context_internal.h"
lib_context * allocate_context(size_t paths_num){
size_t size = sizeof(struct lib_context) + sizeof(const char *[paths_num]);
return calloc(1, size);
}
...