首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为许多C库强制执行一个标准接口

为许多C库强制执行一个标准接口
EN

Stack Overflow用户
提问于 2014-04-16 15:32:07
回答 1查看 80关注 0票数 1

在OO语言中,我们有方法在多个库中强制接口标准化:

代码语言:javascript
复制
   Interface
      |------Implementation A
      |
      \------Implementation B

我有这样的想法:

代码语言:javascript
复制
  Interface.h
      |------Implementation A.c
      |
      \------Implementation B.c

其中Interface.h包含:

  • functionStandard_A()
  • functionStandard_B()

在C中实现这种目标的最佳实践是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-16 15:54:30

C中的“接口”可以通过定义函数指针的struct来创建。每个“具体实现”都会通过这个struct的一个实例呈现出来,它已经初始化了其中的函数指针,以指向该实现中的函数。

例如,设想创建一个调制解调器驱动程序接口,以便不同的C调制解调器驱动程序具有一组标准的功能。我使用调制解调器驱动程序,因为它们是我现在正在开发的应用程序中的一个很好的例子。

接口示例:

代码语言:javascript
复制
typedef struct modem_interface
{
    void (*start_call)(void);
    void (*hang_up)(void);
    ...
}

您可能有两个不同的调制解调器驱动程序,modem_A.cmodem_B.c,每个驱动程序都有各自的函数来处理启动调用、挂起调用和其他操作。每个驱动程序都创建一个modem_interface实例,并将其初始化,以便函数指针指向它的函数。

例如,在modem_A.c中:

代码语言:javascript
复制
...
modem_interface modem_A_interface;
modem_interface.start_call = &modem_A_start_call; 
...

在应用程序的其他地方,您可以获取一个指向调制解调器A‘接口’struct的指针,并调用标准函数(“方法”),因为它们最初是在modem_interface中定义的。

代码语言:javascript
复制
...
modem_A->start_call();
modem_A->hang_up();
...

这样,您可以拥有任意数量的调制解调器驱动程序,但是应用程序可以简单地通过modem_interface指针处理其中的任何一个。例如:

代码语言:javascript
复制
void application_starts_a_call( modem_interface* required_modem )
{
    required_modem->start_call();
    ...
}


// elsewhere:
application_starts_a_call( &modem_A );
application_starts_a_call( &modem_B );

在我赶出门之前,赶快打出来,所以更正是受欢迎的。希望它能很好地说明这个概念。

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

https://stackoverflow.com/questions/23113892

复制
相关文章

相似问题

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