C 是否只使用函数指针来实现回调?
我发现函数指针可以用来实现回调。函数指针还有其他用法吗?还有其他情况证明函数指针有用吗?排序如何?传入函数指针以比较任意两个元素 过滤呢?传入函数指针,以确定输入元素是否应包含在筛选器的输出中 转换呢?传入函数指针以将输入元素转换为输出元素 这些都是基于集合的用途,但它们非常有用。(在.NET中,函数指针的广义等价物是委托,它们是LINQ的基础,LINQ允许非常简单的查询、转换、分组等。)C 是否只使用函数指针来实现回调?,c,function-pointers,use-case,C,Function Pointers,Use Case,我发现函数指针可以用来实现回调。函数指针还有其他用法吗?还有其他情况证明函数指针有用吗?排序如何?传入函数指针以比较任意两个元素 过滤呢?传入函数指针,以确定输入元素是否应包含在筛选器的输出中 转换呢?传入函数指针以将输入元素转换为输出元素 这些都是基于集合的用途,但它们非常有用。(在.NET中,函数指针的广义等价物是委托,它们是LINQ的基础,LINQ允许非常简单的查询、转换、分组等。) 只要你想抽象出“单一行为”的概念,编写一个不需要知道该行为细节的通用函数,函数指针就很有用。除了Jon所写
只要你想抽象出“单一行为”的概念,编写一个不需要知道该行为细节的通用函数,函数指针就很有用。除了Jon所写的,C中的函数指针还可以用来实现OO编程风格(例如多态性)在实现控制相关模式的反转时,是一个有用的特性。所有提到的例子都是IoC原则的应用(排序算法不控制使用的谓词,对对象方法的调用延迟到运行时等) 问候,
Paul函数指针用于在运行时而不是编译时确定要调用的函数的任何情况。这包括回调,但也可以用作开关的替代方案,例如,通过传递定义函数行为的函数指针来调整函数的行为-这就是标准库
qsort()
函数的工作方式,例如,使其能够对任何类型的对象进行排序
我特别使用它们来实现一个命令行解析器,该解析器计算在运行时作为字符串输入的C表达式,并可以包括函数调用。它使用一个符号表来查找指向函数的指针,以便可以根据操作员的要求调用该函数
关于这个问题,你可能想知道的都可以在
归根结底,函数指针只是你随身携带的很少使用的工具之一。如果您理解它们,当出现可能提供解决方案的情况时,您希望能够认识到它。这是在C中实现的唯一方法。正如其他人所提到的,我发现函数指针最重要的用途之一(回调除外)是为了支持通用数据结构的构建 假设您想要构造一个包含任意键和值的hashmap。一种方法是声明
void*键
和void*值
,然后在初始化阶段传入两个函数指针:int(*hashcode)(void*)
和int(*equals)(void*,void*)
这使您能够构建一个hashmap,该hashmap基本上可以接受您可以为其编写上述两个函数的任何内容。在我的例子中,键是一个固定大小的字符缓冲区,值是一个指向结构的指针。它也用于以下内容
- 制作跳转表(如向量表或ISR)
- 使函数抽象化
- 开发有限状态机(由于状态、动作和触发甚至可以使用函数指针轻松实现,因此设计似乎也很简单,可读性也更高)
- 事件驱动框架(GUI-gtk是一个示例)