我正在开发一个大型项目,作为静态库和一个头文件提供给我们的客户,该头文件包含我们公开的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)
这是一个合理的设计模式还是不赞成?谢谢!
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