API设计思想中的C void指针

标签 c

我正在从事一个大型项目,该项目作为静态 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 foobar 等,但您不需要在每个函数的声明和定义中使用它们。

关于API设计思想中的C void指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12164874/

相关文章:

php - PHP 是如何实现它的 all fit container `array` 的?

objective-c - 在 C 中的结构中扩展数组

c - Eclipse C99结构初始化格式化

c - 了解 Unix 中的 `read, write` 系统调用

c++ - Lua 的异步解释器可以解决多线程问题吗?

c - <String.h> 是我的 strncpy 的实现吗?

python - 从命名管道、C 程序(编写器)和 Python(读取器)获取额外数据

检查c数组中添加了多少项?

c - 段错误(核心转储)在执行 'printf' 语句之前获取打印错误

c - stm32 SPI+DMA