函数指针是邪恶的吗? [关闭]

Posted

技术标签:

【中文标题】函数指针是邪恶的吗? [关闭]【英文标题】:Are function pointers evil? [closed] 【发布时间】:2013-10-08 23:16:30 【问题描述】:

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

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

优点:

    代码模块化的绝佳机会 非 OO c 中的类似 OO 的功能(即同一对象中的代码和数据) 您还能如何合理地实现回调?

缺点:

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

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

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

【问题讨论】:

先看看这里吧?半相关? ***.com/questions/667410/… 你为什么不问问这些更资深、更有经验、受过良好教育的程序员,当你有他们的注意力时,他们的意思是什么? 不,他们不是邪恶的。 他们在尽可能远的地方找到工作(最好是在不同的领域?)听起来是个好消息。 骗局 #2 通常是错误的。在现代系统上,对共享库中函数的所有调用都是技术上间接调用(相当于函数指针)。在现代 cpu 上,只要目标地址是 cpu 可预测的,间接调用基本上没有成本,所以这没什么大不了的。 【参考方案1】:

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

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

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

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

【讨论】:

【参考方案2】:

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

没有函数指针,你无法实现:

qsort(3) bsearch(3) Window procedures Threads Signal handlers

还有更多。

【讨论】:

这个答案有很好的例子,我 +1 了,但它并没有真正表达这些例子都是特殊情况的问题类别。

以上是关于函数指针是邪恶的吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

AVL 树是邪恶的吗? [关闭]

实用程序类是邪恶的吗? [关闭]

数据库触发器是邪恶的吗? [关闭]

从静态函数调用函数指针[关闭]

从 C 函数返回指针是好还是坏设计? [关闭]

使用共享指针调用遗留函数