【问题标题】:What is void(*)(void *) [duplicate]什么是 void(*)(void *) [重复]
【发布时间】:2012-10-11 01:21:33
【问题描述】:

可能重复:
What does “void *(*)(void *)” mean in c++?

类型void(*)(void *)是什么意思?

我在“Mastering Algorithms with C”一书的示例代码中遇到了这种类型

void list_init(List *list, void (*destroy)(void *data)) 
{
...

...
}

【问题讨论】:

  • 一个函数指针,指向一个以 void 指针为参数的函数
  • 螺旋规则:指向一个函数的指针,该函数采用指向 void 的指针并且不返回任何内容.
  • 顺便说一句,如果您使用的是 C++11,则它变成了std::function<void(void *)>,它更具可读性和实用性。在执行此操作时,如果您需要任何类型,则可以将 void * 替换为模板。

标签: c++ c function-pointers


【解决方案1】:

这是一个函数指针。

void (*destroy)(void *data)

destroy 是一个指向函数的指针,该函数返回 void 并将 void* 作为参数。

cdecl.org 是识别复杂 C 声明的有用工具。另外,看看the spiral rule

【讨论】:

  • 感谢您的回复。我刚刚发现作者正在使用这个函数指针将函数'free(void *)'(stdlib.h)分配给函数指针'destroy'。不是最易读的方式来做到这一点。尽管存在可读性问题,有谁知道这可能有用的充分理由?我不确定我的评论是否足够清楚。我不知道我是否可以在这里发布整个代码(版权)。
  • @user1535080 destroy 是一个参数,free 不是唯一可能的参数。 “这不是最易读的方法”——你会怎么做? “有谁知道这可能有用的充分理由”——是的;将任意“破坏”函数传递给list_init
  • @user1535080:考虑一种允许自定义释放例程的类型。函数原型是返回void 并以void* 作为参数的函数原型,但也许您想自己进行释放(自管理堆)或只执行一些日志记录。这使您可以分配具有特定签名的任何函数来处理释放。我意识到函数指针的语法一开始看起来很奇怪,但这是 C,在你获得一些经验之后你不会认为它是不可读的(另外,正如 Jim 所说,你会怎么做呢?)
  • 这种语法对于哪些编译器是合法的?由于围绕使用“void (*)(void)”的“语法错误”,R 包 igraph 无法在 CRAN Solaris 服务器上编译:r-project.org/nosvn/R.check/r-patched-solaris-x86/…
  • 你也可以写成void* destroy(void *data)吗?
【解决方案2】:

在这种特定情况下,它是一个指针,任何函数都可以转换为 void(*)(void *) 并且函数参数 void * 可以是任何类型。

【讨论】:

    猜你喜欢
    • 2012-07-16
    • 2014-09-15
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    相关资源
    最近更新 更多