这种界面的技术术语是什么?

时间:2016-06-02 06:16:36

标签: c interface

我使用嵌入式软件,遇到过(以及从这个模型中复制过的)一个我从未在大学里学过的界面(新毕业)。它允许代码库进行library function调用而不知道使用它编译library,假设它们都具有相同的function。下面的示例仅显示了radio1,但假设有一个radio2,radio3等通过makefile处理。

在已编译的library中,我们执行以下操作。在.c源文件中,function声明和接口struct

// function bodies that do things
void radio1_init_radio(void) {}
void radio1_calibrate_radio(void) {} 

// populate global tune interface
const struct tune_if_t tune_if =
{
    .init_radio        = radio1_init_radio,
    .calibrate_radio   = radio1_calibrate_radio
}

然后,在.h中我指定function pointers

struct tune_if_t
{
    void (*init_radio)      (void);
    void (*calibrate_radio) (void);
};

extern const struct tune_if_t tune_if;

这允许库外的系统调用function,而不知道编译并链接了哪个无线电库:

int main( void )
{
    // interface calls
    tune_if.init_radio();
    tune_if.calibrate_radio();

    return 0;
}

我的问题是:

  • 这是否有技术术语?我现在很快就很快就向另一位工程师解释了。

  • 这是完成此类行为的最佳方法吗?

  • 这种方法有什么问题吗?

4 个答案:

答案 0 :(得分:5)

我不知道它在C中是否有更具体的名称,但它是polymorphism的一种形式。它与C ++中的继承和虚函数有关。

答案 1 :(得分:2)

注意:渴望发表评论,但不能回答问题。

当你说“图书馆”时,你的意思是,例如您在构建时链接到的静态或动态库?或者只是在构建时链接到目标文件的源文件?无论哪种方式,我建议你不要为结构使用全局变量,而是建议你有一个特殊命名的函数,它将指向tune_if_t结构的指针作为参数并填充它。如果所有用户都是“库“将使用相同的函数,然后使结构成为函数内部的静态结构,并复制它。

这样就可以更容易地让函数获得一些额外的参数,“库”可以在运行时决定它应该使用哪些函数。这种方式还可以使库更容易成为动态可加载模块,其中不同的进程可以在运行时加载库。

答案 2 :(得分:1)

对我而言,这与plug-ins非常相似。不同之处在于插件应用程序在运行时选择库,而在这里您可以静态链接它,因此您需要在编译时选择实现。

答案 3 :(得分:0)

它只不过是函数指针(init_radio和calibrate_radio)。[也称为回调机制]

你必须与结构中的.operator混淆。它是一种GNU风格,告诉编译器将函数radio1_init_radio的地址分配给函数指针init_radio&函数radio1_calibrate_radio到calibrate_radio函数指针的地址

是的,它是如何在C

中实现多态的