石小疯 发表于 7 天前

C 语言布局体中的函数指针与 Kotlin 高阶函数的对比

在学习 C 语言的过程中,很多 Java/Kotlin 背景的开发者都会对布局体中出现的“函数指针”感到生疏。特别是当看到如下代码时:
struct Animal {
    void (*speak)(void);
};

void dogSpeak() {
    printf("Woof!\n");
}

int main() {
    struct Animal dog;
    dog.speak = dogSpeak;
    dog.speak();
    return 0;
}
这段代码中,布局体 Animal 中的 speak 并不是一个平常变量,而是一个“函数指针”。它的作用是:指向一个函数,然后在合适的时机调用它。这其实与我们在 Kotlin 中使用高阶函数的目标如出一辙。
一、C 中布局体里的函数指针

函数指针的语法大概略显复杂,但本质很简单:


[*]void (*speak)(void) 表示一个函数指针,它指向一个没有参数、返回值为 void 的函数。
[*]给它赋值时,只需要提供函数名(不加括号)。
[*]调用时使用 布局体变量.函数指针() 的方式实行。
函数指针的最大利益是:可以将函数“作为变量”赋值和传递,从而实现雷同回调、战略模式等逻辑。
二、Kotlin 中的高阶函数

Kotlin 提供了原生的高阶函数支持,好比下面这个例子:
fun runTwice(block: () -> Unit) {
    block()
    block()
}

fun main() {
    runTwice { println("Hello") }
}
这里,block: () -> Unit 就是一个“函数类型的参数”,你可以将任何匹配这个署名的 lambda 或函数传入它。
Kotlin 的高阶函数与 C 的函数指针的本质是一样的:将函数作为“值”举行传递、赋值和调用。
三、类比与思索

概念C 语言Kotlin函数作为变量函数指针高阶函数(函数类型)放入布局/对象中布局体中的函数指针成员类/对象中的函数属性调用方式对象.函数指针()对象.函数()使用目标实现回调、战略、接口模仿回调、DSL、扩展性逻辑
页: [1]
查看完整版本: C 语言布局体中的函数指针与 Kotlin 高阶函数的对比