功能指针是邪恶的吗?

时间:2013-10-08 23:16:30

标签: c function-pointers

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

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

优点:

  1. 代码模块化的绝佳机会
  2. 非OO c中的类OO特征(即同一对象中的代码和数据)
  3. 你还能合理地实施回调吗?
  4. 缺点:

    1. 对代码可读性的负面影响 - 在调用函数指针时实际调用的函数并不总是很明显
    2. 与直接函数调用相比,性能较小
    3. 我认为Con#1通常可以通过精心挑选的符号名称和良好的评论来合理地减轻。而Con#2通常不是什么大问题。我错过了什么 - 是否有其他原因可以避免瘟疫等功能指针?

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

2 个答案:

答案 0 :(得分:5)

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

  1. 使用是无偿的,即实际上并不需要你正在做什么,或
  2. 在您编写强化代码并且函数指针可能存储在某个位置的情况下,您可能会担心缓冲区溢出攻击。
  3. 至于何时需要函数指针,Adam的回答提供了一些很好的例子。所有这些示例中的共同主题是调用者需要能够提供从被调用函数运行的部分代码。如果没有函数指针,那么你可以做到这一点的唯一方法就是复制并粘贴函数的实现,并为每个单独的用例调整部分函数来调用不同的函数。对于qsortbsearch,可以移植实现,这只会令人讨厌而且非常丑陋。另一方面,对于线程创建,如果没有函数指针,则必须为正在运行的特定操作系统复制并粘贴部分系统实现,并调整它以调用所需的函数调用。这显然是不可接受的;你的程序将完全不可移植。

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

答案 1 :(得分:4)

不,他们不是邪恶的。为了实现各种功能,例如C中的回调函数,它们是绝对必要的。

如果没有函数指针,则无法实现:

还有更多。