课前叨叨
很多时候,看文章并不是想很深入的学点什么,其实大部分时候是想看看别人在捣鼓什么,有什么新鲜玩意儿,有什么可以借鉴的地方,为了增长眼界见识。我个人来说,其实是自己懒,不想捣鼓什么东西,仅仅想看看别人怎么捣鼓,仅作为一个看客。有一天突然看到一个人捣鼓的东西很有意思,就想把这个人所有捣鼓的东西看一遍。那么这个地儿就当做我捣鼓 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,真的不可思议。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。