回调函数法编写通用的接口

以打印双向链表方法dlist_print函数为例

typedef struct _DListNode

{

   struct _DListNode* prev;

   struct _DListNode* next;

   void* data;

}DListNode;

struct _DList
{
    DListNode* first;
};

typedef struct _DList DList;

 

定义函数指针类型:
typedef void (*DListDataPrintFunc)(void* data);
声明dlist_print函数:
void dlist_print(DList* thiz, DListDataPrintFunc print);

实现dlist_print函数:

void dlist_print(DList* thiz, DListDataPrintFunc print)
{
    DListNode* iter = thiz->first;

    while(iter != NULL)
    {
        print(iter->data);

        iter = iter->next;
    }

    return;
}

调用方法
static void print_int(void* data)
{
printf("%d ", (int)data);
return;
}

dlist_print(dlist, print_int);

调用者如何提供函数给dlist_print呢?当然是通过函数指针了。变量指针指向的是一块数据,
指针指向不同的变量,则取到的是不同的数据。函 数指针指向的是一段代码(即函数),
指针指向不同的函数,则具有不同的行为。函数指针是实现多态的手段,多态就是隔离变化
的秘诀,这里只是一个开端。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值