API API设计思想中的C void指针

Bra*_*tes 4 c

我正在开发一个大型项目,作为静态库和一个头文件提供给我们的客户,该头文件包含我们公开的API的原型.该项目有两个相似但独特的构建,需要在标题中公开不同的数据结构.我试图提出最好的设计,允许单个API函数根据构建使用不同的数据结构.到目前为止,这是我的想法,但我担心这是一个糟糕的设计.

我的功能将像这样实现

void foo(void *generic_data_struct)
{
#ifdef BUILD1
   build1_t *data_struct = generic_data_struct;
#else
   build2_t *data_struct = generic_data_struct;
#endif
...
}
Run Code Online (Sandbox Code Playgroud)

并且,根据客户订单的构建,公开的API标头也将是

void foo(build1_t *data_struct);
Run Code Online (Sandbox Code Playgroud)

要么

void foo(build2_t *data_struct);
Run Code Online (Sandbox Code Playgroud)

这是一个合理的设计模式还是不赞成?谢谢!

zwo*_*wol 5

struct foo;对这种事物使用opaque类型()而不是void指针几乎总是更好.

无论何时进行变体构建,都非常希望最小化#ifdefs的数量.我建议你使用eq的提议,但是使用typedef来计算函数原型的变化:

/* header file */
#ifdef BUILD1
typedef build1_t generic_t;
#else
typedef build2_t generic_t;
#endif

void foo(generic_t *);
void bar(generic_t *);
/* etc */
Run Code Online (Sandbox Code Playgroud)

每当实际行为发生变化时,你仍然需要#ifdefs 里面 等,但是你不需要它们在每个函数的声明和定义上.foobarBUILD1