我使用嵌入式软件,遇到过(以及从这个模型中复制过的)一个我从未在大学里学过的界面(新毕业)。它允许代码库进行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;
}
我的问题是:
这是否有技术术语?我现在很快就很快就向另一位工程师解释了。
这是完成此类行为的最佳方法吗?
这种方法有什么问题吗?
答案 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
中实现多态的