天天来点 C 之 Callback 的实现

课前叨叨

不少时候,看文章并非想很深刻的学点什么,其实大部分时候是想看看别人在捣鼓什么,有什么新鲜玩意儿,有什么能够借鉴的地方,为了增加眼界见识。我我的来讲,实际上是本身懒,不想捣鼓什么东西,仅仅想看看别人怎么捣鼓,仅做为一个看客。有一天忽然看到一我的捣鼓的东西颇有意思,就想把这我的全部捣鼓的东西看一遍。那么这个地儿就当作我捣鼓 C 和 C 相关的一个坑儿吧,不知道能坚持多久。对于 C 我属于初学者,一块儿进步。html

推荐一个捣鼓大神 bellard,这是法国的一个大神,对音视频编解码,编译原理真的不能再熟透了,说是天才一点都不过度,能和 Linus Torvalds 齐肩的人,这我的在知乎上的成就介绍连接算法

Callback

C 中函数也是指针,叫作函数指针。能够经过这样的方式 typedef void (*callback_t)(char *) 定义一个新的类型叫 callback_t,是一个函数指针。闭包

第一问:callback_t 前边为何要加一个星号?表明它是指针类型。函数

第二问:是一个指针能看出来了,可是为何是一个函数指针呢?是由于后边的第二对儿括号儿,若是没有后边的第二对儿括号它就是一个指针而已。ui

下边是完整代码:spa

#include <stdio.h>

typedef void (*callback_t)(char *);

void callback_test(char *str) {
    printf("%s\n", str);
    return;
}

void callback_main(callback_t cb) {
    cb("hello");
    return;
}

int main(int argc, char const *argv[]) {
    callback_main((callback_t)(&callback_test));
    return 0;
}
复制代码

变形一

main 函数中有一个强转的指针类型,不强转能够么?答案能够,C 中任何指针均可以相互之间强转,只要你知道你在作什么。修改为这样 callback_main(&callback_test); 也 OK。指针

完整代码以下:code

#include <stdio.h>

typedef void (*callback_t)(char *);

void callback_test(char *str) {
  printf("%s\n", str);
  return;
}

void callback_main(callback_t cb) {
  cb("hello");
  return;
}

int main(int argc, char const *argv[]) {
  callback_main(&callback_test);
  return 0;
}
复制代码

变形二

最上边定义了一种新的类型 callback_t,不定义可不能够?答案也能够。只须要修改 callback_main 的入参定义就 OK 了。修改为这样 void callback_main(void (*cb)(char *))视频

完整代码以下:htm

#include <stdio.h>

typedef void (*callback_t)(char *);

void callback_test(char *str) {
  printf("%s\n", str);
  return;
}

void callback_main(void (*cb)(char *)) {
  cb("hello");
  return;
}

int main(int argc, char const *argv[]) {
  callback_main(&callback_test);
  return 0;
}
复制代码

课后叨叨

不知道还可不能够有别的变形的东西,下次想一想捣鼓一个模仿 Javascript 闭包的东西,配合 Callback。

bellard 大神的那个捣鼓素数的程序也想捣鼓捣鼓,里边有一些比较高深的算法,快速傅里叶变换之类的,跃跃欲试。他的 Code 就在这里,就那么短短的一坨,编译出来就有 220M,真的难以想象。

相关文章
相关标签/搜索