功能指针是邪恶的吗?

Dig*_*uma -1 c function-pointers

我已经被更高级的,经验丰富,受过良好教育的程序员比我告知,使用的应该避免.我已经看到一些代码包含函数指针作为不重用该代码的理由,即使唯一的替代方案是完全重新实现.经过进一步讨论,我无法确定为什么会这样.我很乐意在适当的地方使用函数指针,就像它们允许你做的有趣和强大的东西一样,但我是否因使用它们而谨慎对待风?

我看到函数指针的优缺点如下:

优点:

  1. 代码模块化的绝佳机会
  2. 非OO c中的类似OO的特征(即同一对象中的代码和数据)
  3. 你怎么能合理地实现回调?

缺点:

  1. 对代码可读性的负面影响 - 在调用函数指针时实际调用的函数并不总是很明显
  2. 与直接函数调用相比,性能较小

我认为Con#1通常可以通过精心挑选的符号名称和良好的评论来合理地减轻.而Con#2通常不是什么大问题.我错过了什么 - 是否有其他理由避免像瘟疫一样的功能指针?

这个问题看起来有点讨论 - 但我正在寻找很好的理由,为什么我不应该使用函数指针,而不是意见

R..*_*R.. 5

函数指针不是邪恶的.你不应该使用它们的主要时间是:

  1. 使用是无偿的,即实际上并不需要你正在做什么,或者
  2. 在您编写强化代码并且函数指针可能存储在某个位置的情况下,您可能会担心缓冲区溢出攻击.

至于何时需要函数指针,Adam的答案提供了一些很好的例子.所有这些示例中的共同主题是调用者需要能够提供从被调用函数运行的部分代码.如果没有函数指针,那么你可以做到这一点的唯一方法就是复制并粘贴函数的实现,并为每个单独的用例调整部分函数来调用不同的函数.对于qsortbsearch可以实施的便携式实施,这只会令人讨厌并且非常丑陋.另一方面,对于线程创建,如果没有函数指针,则必须复制并粘贴部分系统实现对于您正在运行的特定操作系统,并调整它以调用您想要调用的函数.这显然是不可接受的; 那么你的程序将是完全不可移植的.

因此,函数指针对于某些任务是绝对必要的,对于其他任务,它们是允许重用通用代码的主要方便.我认为没有理由不在这种情况下使用它们.