我正在从事一个大型项目,该项目作为静态 c 库和一个头文件提供给我们的客户,其中包含我们公开的 API 的原型(prototype)。该项目有两个相似但独特的构建,它们需要在 header 中公开不同的数据结构。我正在尝试提出最佳设计,以允许单个 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
...
}
根据客户订单的构建,公开的 API header 将是
void foo(build1_t *data_struct);
或
void foo(build2_t *data_struct);
这是一个合理的设计模式还是不受欢迎?谢谢!
最佳答案
对于这种事情,使用不透明类型 (struct foo;
) 几乎总是比使用 void
指针更好。
每当您有变体构建时,都非常希望尽量减少#ifdef 的数量。我建议您使用 eq- 的建议,但使用 typedef 排除函数原型(prototype)中的变化:
/* 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 */
当实际行为基于 BUILD1
发生变化时,您仍然需要 #ifdefs inside foo
、bar
等,但您不需要在每个函数的声明和定义中使用它们。
关于API设计思想中的C void指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12164874/