课前叨叨

很多时候,看文章并不是想很深入的学点什么,其实大部分时候是想看看别人在捣鼓什么,有什么新鲜玩意儿,有什么可以借鉴的地方,为了增长眼界见识。我个人来说,其实是自己懒,不想捣鼓什么东西,仅仅想看看别人怎么捣鼓,仅作为一个看客。有一天突然看到一个人捣鼓的东西很有意思,就想把这个人所有捣鼓的东西看一遍。那么这个地儿就当做我捣鼓 C 和 C 相关的一个坑儿吧,不知道能坚持多久。对于 C 我属于初学者,一起进步。

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

Callback

C 中函数也是指针,叫做函数指针。可以通过这样的方式 typedef void (*callback_t)(char *) 定义一个新的类型叫 callback_t,是一个函数指针。

第一问:callback_t 前边为什么要加一个星号?代表它是指针类型。

第二问:是一个指针能看出来了,但是为什么是一个函数指针呢?是因为后边的第二对儿括号儿,如果没有后边的第二对儿括号它就是一个指针而已。

下边是完整代码:

#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。

完整代码如下:

#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 *))

完整代码如下:

#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,真的不可思议。


Tosone
341 声望4 粉丝

一个好奇心极重的人。