【问题标题】:Is the only use of function pointers to implement callbacks?是唯一使用函数指针来实现回调吗?
【发布时间】:2011-03-26 09:29:23
【问题描述】:

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

【问题讨论】:

  • 感谢所有答案,但我只能选择一个:)

标签: c function-pointers use-case


【解决方案1】:

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

过滤怎么样?传入一个函数指针来决定一个输入元素是否应该包含在过滤器的输出中。

转型怎么样?传入函数指针以将输入元素转换为输出元素。

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

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

【讨论】:

  • 这并不重要,但我将所有这些情况都称为“回调”,原因很简单,在 C 语言中,函数调用任何类型的用户提供的函数有点不寻常代码,几乎所有这类我都会在 C 中称为“回调”的东西。发问者所说的“回调”可能就是我通常所说的“异步回调”或“注册回调/侦听器” ,并考虑一下,在使用 Java 时,我当然不会将用户提供的对象上的每个调用都称为“回调”...
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    问候,

    保罗

    【讨论】:

    • 我相信详细说明“类型化和更高级的等效项” 对您很有用——也许太神秘了..
    • 好吧,详细说明可能会填满整本书 - 因此我相信一些“流行语”应该可以完成这项工作......
    • 也许吧,但我不明白你的意思,所以也许不是 ;) 没有其他人要求你详细说明,所以也许只有我一个人,或者可能是 皇帝的情况新衣服。我所要求的只是你列举等价物,而不一定要解释它们。
    【解决方案4】:

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

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

    你可能想知道的关于这个主题的所有信息都可以在The Function Pointer Tutorials找到

    最后,函数指针只是您放在包里的那些很少使用的工具之一。如果你理解它们,当它可能提供解决方案的情况出现时,你会希望能认出它。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        假设你想构建一个带有任意键和值的哈希图。一种方法是同时声明void *keyvoid *value,然后在初始化阶段传入两个函数指针:int (*hashcode)(void*)int (*equals)(void*, void*)

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

        【讨论】:

          【解决方案7】:

          下面也会用到

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

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              猜你喜欢
              • 2020-05-03
              • 1970-01-01
              • 2011-10-14
              • 1970-01-01
              • 1970-01-01
              • 2015-02-02
              • 1970-01-01
              • 2020-04-06
              • 2017-10-02
              相关资源
              最近更新 更多