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

时间:2011-03-26 09:29:24

标签: c function-pointers use-case

我遇到过函数指针可用于实现回调的事实。函数指针还有其他用法吗?是否有其他情况证明函数指针有用?

8 个答案:

答案 0 :(得分:3)

排序怎么样?传入一个函数指针来比较任何两个元素。

过滤怎么样?传入函数指针以确定输入元素是否应包含在过滤器的输出中。

变换怎么样?传入一个函数指针,将输入元素转换为输出元素。

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

您希望能够抽象出“单一行为”的概念,编写一个不需要知道该行为细节的泛型函数,函数指针可能很有用。

答案 1 :(得分:3)

除了Jon写的内容之外,C中的函数指针可用于实现OO编程风格(例如,多态)。

答案 2 :(得分:2)

在实现控件相关模式的反演时,函数指针(或其类型和更高级的等价物)是一个有用的功能。提到的所有示例都是IoC原则的应用(排序算法不控制使用的谓词,对对象方法的调用被延迟到运行时等)

此致

答案 3 :(得分:2)

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

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

您可能希望了解有关此主题的所有信息,请访问The Function Pointer Tutorials

最后,函数指针只是您保存在包中的一种很少使用的工具。如果您了解它们,当出现可能提供解决方案的情况时,您将有希望认识到它。

答案 4 :(得分:2)

这是您在C中实现Higher Order Functions的唯一方法。

答案 5 :(得分:2)

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

假设您要构建具有任意键和值的哈希映射。一种方法是声明void *keyvoid *value,然后在初始化阶段传递两个函数指针:int (*hashcode)(void*)int (*equals)(void*, void*)

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

答案 6 :(得分:2)

它也用于以下

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

答案 7 :(得分:1)

除了回调(非常适合抽象)之外,函数指针可用于在C中实现多态性。这在Linux内核和glibc,GTK +和GLib等常用C库中广泛完成。