【发布时间】:2011-03-26 09:29:23
【问题描述】:
我发现函数指针可以用来实现回调。函数指针还有其他用途吗?还有其他情况证明函数指针有用吗?
【问题讨论】:
-
感谢所有答案,但我只能选择一个:)
标签: c function-pointers use-case
我发现函数指针可以用来实现回调。函数指针还有其他用途吗?还有其他情况证明函数指针有用吗?
【问题讨论】:
标签: c function-pointers use-case
排序怎么样?传入一个函数指针来比较任意两个元素。
过滤怎么样?传入一个函数指针来决定一个输入元素是否应该包含在过滤器的输出中。
转型怎么样?传入函数指针以将输入元素转换为输出元素。
这些都是基于集合的用途,但它们非常有用。 (.NET 中函数指针的广泛等价物是委托,它们是 LINQ 的基础,允许非常简单的查询、转换、分组等。)
在您希望能够抽象出“单一行为”的概念的任何地方,编写一个不需要知道该行为细节的通用函数,函数指针可能很有用。
【讨论】:
除了 Jon 写的以外,C 中的函数指针可用于实现 OO 编程风格(例如多态)。
【讨论】:
在实现控制反转相关模式时,函数指针(或其类型化和更高级的等价物)是一个有用的特性。提到的所有例子都是 IoC 原理的应用(排序算法不控制使用的谓词,对对象方法的调用延迟到运行时等)
问候,
保罗
【讨论】:
函数指针用于在运行时而不是编译时确定要调用的函数的任何情况。这包括回调,但也可以用作例如 switch-case 替代方案,并通过传递定义该行为的函数指针来调整函数的行为 - 这就是标准库 qsort() 函数的工作方式,例如,使其能够对任何类型的对象进行排序。
我特别使用它们来实现一个命令行解析器,该解析器在运行时评估作为字符串输入的 C 表达式,并且可以包含函数调用。这使用 符号表 来查找指向函数的指针,以便操作员按需调用它。
你可能想知道的关于这个主题的所有信息都可以在The Function Pointer Tutorials找到
最后,函数指针只是您放在包里的那些很少使用的工具之一。如果你理解它们,当它可能提供解决方案的情况出现时,你会希望能认出它。
【讨论】:
这是您可以在 C 中实现 Higher Order Functions 的唯一方法。
【讨论】:
正如其他人所提到的,我发现函数指针(除了回调之外)最重要的用途之一是支持构建通用数据结构。
假设你想构建一个带有任意键和值的哈希图。一种方法是同时声明void *key 和void *value,然后在初始化阶段传入两个函数指针:int (*hashcode)(void*) 和int (*equals)(void*, void*)。
这使您能够构建一个哈希映射,该哈希映射基本上可以采用您可以编写上述两个函数的任何内容。在我的例子中,键是一个固定大小的字符缓冲区,值是一个指向结构的指针。
【讨论】:
下面也会用到
【讨论】:
除了回调(非常适合抽象)之外,函数指针还可用于在 C 中实现多态性。这在 Linux 内核以及 glibc、GTK+ 和 GLib 等常见 C 库中广泛使用。
【讨论】: