c - 封装对类似结构的访问

标签 c

我的应用程序是用 C 编写的。我有一个模块使用来自某个给定 全局结构的一些数据。我现在必须扩展模块以选择性地针对不同的给定全局结构工作,该结构基本上提供相同的字段(就我的模块而言),但名称不同。

这里有一个汽车类比,希望能让我的问题更清楚。我有这两个我无法控制的全局结构。

struct {
   unsigned char manufacturer_id;
   unsigned short top_speed;
} Car;

struct {
   RGB_t color;
   unsigned short topSpeed;
   unsigned char mfr;
} Automobile;

假设我的 Car Manager 模块使用来自 Automobile 的信息。例如,

const char *car_manager__get_manufacturer_name(car_manager_t *self)
{
    return self->manufacturers[Automobile.mfr];
}

我想扩展 Car Manager 以可选地(可能由 car_manager_t 实例中的标志决定)使用来自 Car 的相同信息,因此上述函数将返回 self->manufacturers[Car.manufacturer_id]。添加此功能时,我不想在模块中复制任何逻辑。

我假设我必须在访问全局结构时放置一个接口(interface)。关于如何做到这一点有什么建议吗?

最佳答案

我会定义函数来获取所需的值,并将指针传递给函数。您甚至可以传递一个包含所需函数指针的结构。

struct Interface {
  unsigned char  (*manufacturer)(void);
  unsigned short (*top_speed)(void);
}
struct Interface CarInterface  = {&Car_manufacturer, &Car_top_speed};
struct Interface AutoInterface = {&Auto_manufacturer, &Auto_top_speed};

const char *car_manager__get_manufacturer_name(car_manager_t *self, Interface i)
{
  return self->manufacturers[(*i.manufacturer)()];
}

好久没写C语言了;如有必要,请更正我的语法!

关于c - 封装对类似结构的访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9024055/

相关文章:

c - 程序获取 EXC_BAD_ACCESS

c - C 中的二维数组排序

c - Linux 内核出错

c++ - 使用 C/C++ 在 Windows 资源管理器中打开目录

c - Printf 不按程序顺序执行

python - pygtk 和 native gtk_main();混合

c - 从命令行读取文本文件 C

C程序从数组中打印出LCD数字

c - 何时为 OpenMP 使用私有(private)和共享变量

c - 访问内核模块中进程的预定指令