函数指针和虚拟函数表(VFT)

本文探讨了函数指针在C语言中的应用,如何通过它们实现数据结构的操作并提高代码复用。同时,介绍了虚拟函数表(VFT)的概念,作为接口设计的一种方式,允许根据不同场景调整功能。虽然函数指针带来了灵活性,但也可能增加代码阅读难度。VFT则可能导致接口膨胀,但能适应多种协议和功能。在内核级编程和系统设计中,这两种机制都有其独特价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 函数指针
    函数指针是一种简洁且高效的编码方式,可以提高代码的复用率,又能利用面向对象语言的某些优点。在数据结构类型(对象)的定义中,你可以包含一组函数指针(方法/接口),于是,该结构的部分/全部操作都可以通过嵌入的函数来完成。
    C语言的函数指针在数据结构中大致如下:
struct object {
    ...
    int (*init)(int argc, const char *argv);
    int (*mainloop)(int mode);
    void (*fini)(void);
    ...
};

函数指针的优点,在于可以根据不同的准则和对象所扮演的角色不同进行有区别的初始化,因此,调用object->init时,实际上可能会因为不同的object调用不同的init接口。可以产生对上层来说透明化的接口。
在内核方面,函数指针可以作为不同子模块之间的接口,或者一种通用的机制,根据某个子模块所做的某事的结果,在适当的时机调用适当的接口进行处理,在其他情况下,函数指针也可以作为一种通用方式,使得协议、设备驱动程序或某个功能模块的接口特殊化。
注意,调用函数指针时,必须检查该值是否为NULL,避免引用了NULL出现意外。
当然,函数指针也存在缺点,就是阅读代码时容易断,稍显困难,这点明显不同于传统的面向流程的代码。这种情况下,继续阅读代码必须搞清楚该函数指针是如何/在哪里初始化的。

  • 虚拟函数表
    virtual function table,简称VFT,通常指向一个数据结构的一组函数指针便成为虚拟函数表。
    当VFT作为两个子系统之间的接口时,或者VFT只是作为输出或者某个内核组件的接口时,VFT中的函数指针数目可能会膨胀,以包含不同的函数指针,从而适应各种各样的协议或者功能。每种功能实际场景中可能只用到所提供的所有函数指针中的很少一部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值