-1

比我更资深、更有经验和受过更好教育的程序员告诉我,应该避免在我已经看到一些代码包含函数指针作为不重用该代码的理由这一事实,即使唯一的选择是完全重新实现也是如此。经过进一步讨论,我无法确定为什么会这样。我很乐意在适当的地方使用函数指针,并且喜欢它们允许您做的有趣而强大的事情,但是我是否在使用它们时将谨慎抛诸脑后?

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

优点:

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

缺点:

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

我认为 Con #1. 通常可以通过精心选择的符号名称和良好的评论来合理地缓解。而Con #2. 一般不会有什么大不了的。我是否遗漏了什么——还有其他原因可以避免像瘟疫这样的函数指针吗?

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

4

2 回答 2

5

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

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

至于何时需要函数指针,亚当的回答提供了一些很好的例子。所有这些示例的共同主题是调用者需要能够提供从被调用函数运行的部分代码。如果没有函数指针,您可以做到这一点的唯一方法是复制并粘贴函数的实现,并针对每个单独的用例更改其中的一部分以调用不同的函数。对于qsortbsearch,可以移植地实现,这只会令人讨厌并且丑陋得可怕。另一方面,对于线程创建,如果没有函数指针,您将不得不复制和粘贴部分系统实现对于您正在运行的特定操作系统,并对其进行调整以调用您想要调用的函数。这显然是不可接受的;您的程序将完全不可移植。

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

于 2013-10-09T00:14:45.647 回答
4

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

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

还有很多。

于 2013-10-08T23:31:41.217 回答