有人可以解释参数void(*pfn)(void*)吗?

dik*_*era 4 c++ pointers function-pointers

我遇到过这段代码

inline pthread_t CreateThread(void(*pfn)(void*), void* parg, bool fWantHandle=false)
Run Code Online (Sandbox Code Playgroud)

我不明白这一部分

void(*pfn)(void*)
Run Code Online (Sandbox Code Playgroud)

有人能告诉我这是什么意思吗?

这是btw没有在初学者的书籍中列出,所以如果你想提到阅读书籍,它不存在.

Afaik,void是一个函数的数据类型,意味着它不会返回任何东西,但是那个部分......指针上使用了void?

cni*_*tar 9

它是一个返回void和接受函数的函数指针void *.

void example(void *arg);
Run Code Online (Sandbox Code Playgroud)

您可以在The Function Pointer Tutorials中找到有关C++(和C语言)中函数指针的更多信息.


Ted*_*opp 6

这些内容最简单易读:

  • (*pfn)>" pfn是一个指针"
  • void x(void*)>>" x是接受void *参数并返回的函数void"

把它们放在一起,你有:

  • " pfn是指向接受void *参数并返回的函数的指针void"

请注意,(*pfn)由于优先权,周围的parens 是必要的.void *pfn(void*)将被解释为如果它被写(void *)pfn(void *):" pfn是一个接受a void *并返回void *" 的函数.


Pre*_*gha 6

这是一个函数指针(或指向函数的指针).

void(*pfn)(void*)
Run Code Online (Sandbox Code Playgroud)

这样就分解了:

*pfn (指针的名称,即指向函数的指针)

(void *) (这些是函数的参数,即指向任何东西的简单指针)

void (这是从函数返回)

所以,如果你有这样的功能:

void DoSomeThing(void *data) {
  ... does something....
}
Run Code Online (Sandbox Code Playgroud)

然后你就可以把它传递给CreateThread函数了......

int i  = 99;
void * arg = (void*)&i;
pthread_t thread = CreateThread(DoSomeThing, arg, ... other parameters ...);
Run Code Online (Sandbox Code Playgroud)

所以CreateThread它的某个地方会打个电话:

pfn(parg);
Run Code Online (Sandbox Code Playgroud)

并且你的函数DoSomeThing将被调用,void * data你得到的将是你传入的arg.

更多信息:

请记住,代码只是内存中的一个字节序列.这就是cpu如何解释它们使它们与我们称之为数据的东西不同.

因此,在程序的任何一点,我们都可以通过它的内存地址来引用代码的另一部分.由于代码被分解为C语言中的函数,因此这是一个有用的重用单元,C理解并允许我们将函数的地址视为另一个指向某些数据的指针.

在上面的示例中,CreateThread函数需要函数的地址,以便它可以在新线程中执行该函数.所以我们传给它一个指向该函数的指针.因此我们传递一个函数指针.


SLa*_*aks 5

这称为函数指针.
它指的是函数而不是变量.

如果它不在你的书中,你应该得到一本更好的书.