首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C编程多个存储后端

C编程多个存储后端
EN

Software Engineering用户
提问于 2013-10-18 20:37:05
回答 2查看 291关注 0票数 5

我正在用C启动一个附带项目,它需要由特定逻辑驱动的多个存储后端。这些存储后端将与在运行时指定使用哪个存储后端的决定相关联。

因此,例如,如果我用一组参数调用我的程序,它将在内存中执行操作,但如果我更改程序配置,它将写入磁盘。

其基本思想是每个存储后端应该实现相同的协议。换句话说,执行操作的逻辑应该知道它在哪个后端上操作。

目前,我认为提供这个间接方向的方式是有一个函数指针的struct,其逻辑调用这些函数指针。实际上,该结构将包含实现更高级别逻辑所需的所有操作,例如。

代码语言:javascript
复制
struct Context {
    void (* doPartOfDoOp)(void)
    int (* getResult)(void); 
}

//logic.h
void doOp(Context * context) {
    //bunch of stuff
    context->doPartOfDoOp();
}

int getResult(Context * context) {
    //bunch of stuff
    return context->getResult();
} 

我的问题是,如果这种解决问题的方式是一个C程序员会理解的?我是一名Java开发人员,但喜欢使用C/++。从本质上讲,上下文结构提供了一个类似于间接级的接口。不过,我想知道是否有一种较为惯用的方法来达到这个目标。

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2013-10-19 09:05:08

是的,一个经验丰富的C程序员肯定会理解这样的结构。在C语言中,使用函数指针是在运行时选择要执行的一组函数中哪个函数的唯一方法。

在结构中存储函数指针的Ans给出了一个非常清楚的信号,表明这些函数属于一起,是在C中模拟方法/成员函数的一种非常常见的方法。

我建议的一个更改是将Context结构也作为函数指针的“this指针”传递,如下所示:

代码语言:javascript
复制
struct Context {
    void (* doPartOfDoOp)(struct Context*)
    int (* getResult)(struct Context*); 
};

//logic.h
void doOp(Context * context) {
    //bunch of stuff
    context->doPartOfDoOp(context);
}

int getResult(Context * context) {
    //bunch of stuff
    return context->getResult(context);
}

在C中,如果有指向结构的第一个成员的指针,则可以将该指针转换为struct类型本身,并使用它访问其他成员。这允许您构建一种继承树,并且可以为后端提供“成员变量”,如下所示:

代码语言:javascript
复制
struct FileBackend {
    struct Context interface;
    FILE* file;
}

void doPartOfDoOpFileBackend(struct Context* context)
{
    struct FileBackend* this = (struct FileBackend)context;
    // do stuff, accessing the file through this->file.
}
票数 3
EN

Software Engineering用户

发布于 2021-12-03 14:51:46

另一些人说,这是C中的OOP,这是正常的。

微软的COM对所有接口都有双重定义,一个用于C++,另一个用于C。每个接口都是函数指针的struct

FFmpeg将此策略用于大多数重要类型(编码器/解码器、密码器、IO、协议等)。有分配(Create)/init/free函数,允许版本灵活链接。

当然,您可以拥有一个具有函数指针和普通数据成员的struct。它类似于对象的C++布局。或者一路走,拥有对象的数据+ vtbl指针,以及一个函数指针表(实际上是虚拟函数)。

我会将Context改为更具体、更具体的东西,例如BackendStorage或类似的东西。

票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/214894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档