gpt4 book ai didi

c - 函数指针是邪恶的吗?

转载 作者:行者123 更新时间:2023-11-30 18:18:02 25 4
gpt4 key购买 nike

比我更资深、更有经验、受过更好教育的程序员告诉我,使用应该避免。我已经看到这样一个事实,即某些代码包含函数指针,这是不重用该代码的理由,即使唯一的选择是完全重新实现。经过进一步讨论,我无法确定为什么会这样。我很高兴在适当的地方使用函数指针,并且喜欢它们允许你做的有趣而强大的事情,但是我使用它们是不是把谨慎抛到了九霄云外?

我认为函数指针的优点和缺点如下:

优点:

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

缺点:

  1. 对代码可读性的负面影响 - 调用函数指针时实际调用的函数并不总是显而易见
  2. 与直接函数调用相比,性能受到轻微影响

我认为第 1 个问题通常可以通过精心选择的符号名称和良好的注释来合理地缓解。缺点#2. 一般来说不是什么大问题。我是否遗漏了一些东西 - 还有其他原因来避免像瘟疫一样的函数指针吗?

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

最佳答案

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

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

至于什么时候需要函数指针,Adam的回答提供了一些很好的例子。所有这些示例的共同主题是调用者需要能够提供从被调用函数运行的部分代码。如果没有函数指针,唯一的方法就是复制并粘贴函数的实现,并更改其中的一部分以针对每个单独的用例调用不同的函数。对于可移植实现的 qsort 和 bsearch 来说,这只会是一件麻烦事,而且极其丑陋。另一方面,对于线程创建,如果没有函数指针,您将必须为您正在运行的特定操作系统复制并粘贴部分系统实现,并对其进行调整以调用您想要的函数叫。这显然是 Not Acceptable ;那么你的程序将完全不可移植。

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

关于c - 函数指针是邪恶的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19260203/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com