C 是否只使用函数指针来实现回调?

C 是否只使用函数指针来实现回调?,c,function-pointers,use-case,C,Function Pointers,Use Case,我发现函数指针可以用来实现回调。函数指针还有其他用法吗?还有其他情况证明函数指针有用吗?排序如何?传入函数指针以比较任意两个元素 过滤呢?传入函数指针,以确定输入元素是否应包含在筛选器的输出中 转换呢?传入函数指针以将输入元素转换为输出元素 这些都是基于集合的用途,但它们非常有用。(在.NET中,函数指针的广义等价物是委托,它们是LINQ的基础,LINQ允许非常简单的查询、转换、分组等。) 只要你想抽象出“单一行为”的概念,编写一个不需要知道该行为细节的通用函数,函数指针就很有用。除了Jon所写

我发现函数指针可以用来实现回调。函数指针还有其他用法吗?还有其他情况证明函数指针有用吗?

排序如何?传入函数指针以比较任意两个元素

过滤呢?传入函数指针,以确定输入元素是否应包含在筛选器的输出中

转换呢?传入函数指针以将输入元素转换为输出元素

这些都是基于集合的用途,但它们非常有用。(在.NET中,函数指针的广义等价物是委托,它们是LINQ的基础,LINQ允许非常简单的查询、转换、分组等。)


只要你想抽象出“单一行为”的概念,编写一个不需要知道该行为细节的通用函数,函数指针就很有用。

除了Jon所写的,C中的函数指针还可以用来实现OO编程风格(例如多态性)在实现控制相关模式的反转时,是一个有用的特性。所有提到的例子都是IoC原则的应用(排序算法不控制使用的谓词,对对象方法的调用延迟到运行时等)

问候,


Paul

函数指针用于在运行时而不是编译时确定要调用的函数的任何情况。这包括回调,但也可以用作开关的替代方案,例如,通过传递定义函数行为的函数指针来调整函数的行为-这就是标准库
qsort()
函数的工作方式,例如,使其能够对任何类型的对象进行排序

我特别使用它们来实现一个命令行解析器,该解析器计算在运行时作为字符串输入的C表达式,并可以包括函数调用。它使用一个符号表来查找指向函数的指针,以便可以根据操作员的要求调用该函数

关于这个问题,你可能想知道的都可以在


归根结底,函数指针只是你随身携带的很少使用的工具之一。如果您理解它们,当出现可能提供解决方案的情况时,您希望能够认识到它。

这是在C中实现的唯一方法。

正如其他人所提到的,我发现函数指针最重要的用途之一(回调除外)是为了支持通用数据结构的构建

假设您想要构造一个包含任意键和值的hashmap。一种方法是声明
void*键
void*值
,然后在初始化阶段传入两个函数指针:
int(*hashcode)(void*)
int(*equals)(void*,void*)


这使您能够构建一个hashmap,该hashmap基本上可以接受您可以为其编写上述两个函数的任何内容。在我的例子中,键是一个固定大小的字符缓冲区,值是一个指向结构的指针。

它也用于以下内容

  • 制作跳转表(如向量表或ISR)
  • 使函数抽象化
  • 开发有限状态机(由于状态、动作和触发甚至可以使用函数指针轻松实现,因此设计似乎也很简单,可读性也更高)
  • 事件驱动框架(GUI-gtk是一个示例)

这并不重要,但我会将所有这些情况都称为“回调”,原因很简单,在C中,函数调用任何类型的用户提供的代码都有点不寻常,所以在C中,我会称之为“回调”。发问者所谓的“回调”可能就是我通常调用的“异步回调”或“注册回调/侦听器”,考虑到这一点,在使用Java时,我当然不会将用户提供的对象上的每个调用都称为“回调”……我相信,详细说明“类型化的和更高级的等价物”会很有用“-可能有点太神秘了..好吧,详细阐述这一点可能会填满整本书-因此,我认为,一些“流行语”应该可以完成这项工作…也许吧,但我不知道你的意思,所以也许不是;)没有人要求你详细说明,所以可能只是我,或者可能是皇帝的新衣。我只要求你列举等价物,不一定要解释它们。谢谢所有的答案,但我只能选择一个:)