gpt4 book ai didi

c++ - 有些函数不采用 void* 是有原因的吗?

转载 作者:行者123 更新时间:2023-11-30 05:47:33 26 4
gpt4 key购买 nike

许多函数接受函数指针作为参数。 atexitcall_once 是很好的例子。如果这些更高级别的函数接受一个 void* 参数,例如 atexit(&myFunction, &argumentForMyFunction),那么我可以通过传递一个函数指针和一个数据 block 来轻松包装我喜欢的任何仿函数以提供有状态性。

在很多情况下,我希望可以注册一个带参数的回调,但注册函数不允许我传递任何参数。 atexit 只接受一个参数:一个接受 0 个参数的函数。我不能注册一个函数来清理我的对象,我必须注册一个函数来清理一个类的所有对象,并强制我的类维护一个需要清理的所有对象的列表。

我一直认为这是一种疏忽,似乎没有正当理由为什么你不允许传递一个可怜的 4 或 8 字节指针,除非你在一个极其有限的微 Controller 上。我一直认为他们根本没有意识到额外参数的重要性,直到为时已晚而无法重新定义规范。对于 call_once,posix 版本不接受任何参数,但 C++11 版本接受一个仿函数(这实际上等同于传递一个函数和一个参数,只是编译器做了一些为你工作)。

有什么理由可以选择不允许这个额外的论点吗?仅接受“具有 0 个参数的无效函数”是否有优势?

最佳答案

我认为 atexit 只是一个特例,因为无论你传递给它什么函数都应该只被调用一次。因此,它需要完成其工作的任何状态都可以保存在全局变量中。如果今天设计 atexit,它可能需要一个 void* 来避免使用全局变量,但这实际上不会给它任何新功能;在某些情况下,它只会让代码更简洁一些。

不过,对于许多 API,允许回调采用额外的参数,不允许它们这样做将是一个严重的设计缺陷。例如,pthread_create 确实允许您传递一个 void*,这是有道理的,否则您需要为每个线程创建一个单独的函数,并且完全不可能编写生成可变数量线程的程序。

关于c++ - 有些函数不采用 void* 是有原因的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28523271/

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