C++ 有人能解释参数void(*pfn)(void*)吗?

C++ 有人能解释参数void(*pfn)(void*)吗?,c++,pointers,function-pointers,C++,Pointers,Function Pointers,我遇到了这段代码 inline pthread_t CreateThread(void(*pfn)(void*), void* parg, bool fWantHandle=false) 我不明白这部分 void(*pfn)(void*) 有人能告诉我这是什么意思吗 这是顺便说一句,没有列出的书籍,为初学者,所以如果你想提到阅读书籍,它不存在 好的,void是一个函数的数据类型,意味着它不会返回任何东西,但是其中的那部分…void用于指针?这称为a。 它指向一个函数而不是一个变量 如果它不在

我遇到了这段代码

inline pthread_t CreateThread(void(*pfn)(void*), void* parg, bool fWantHandle=false)
我不明白这部分

void(*pfn)(void*)
有人能告诉我这是什么意思吗

这是顺便说一句,没有列出的书籍,为初学者,所以如果你想提到阅读书籍,它不存在

好的,void是一个函数的数据类型,意味着它不会返回任何东西,但是其中的那部分…void用于指针?

这称为a。
它指向一个函数而不是一个变量


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

它是一个函数指针,指向返回
void
并接受
void*
的函数

void example(void *arg);

<>您可以在C++中(C中)找到更多关于函数指针的信息。(

< p> <代码> pfn < /Cord>是一个函数指针,它的返回类型是“强>空< /强>,并且参数的类型是<强>空*>强>

< p>这是一个返回的空格,并取一个(见空洞指针的部分)。.

这些东西最容易从里到外阅读:

  • (*pfn)
    =>“
    pfn
    是指针”
  • void x(void*)
    =>“
    x
    是一个接受
    void*
    参数并返回
    void
    的函数。”
把它们放在一起,你就有了:

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

请注意,
(*pfn)
周围的参数是必需的,因为优先级较高
void*pfn(void*)
将被解释为它是被写入的
(void*)pfn(void*)
:“
pfn
是一个接受
void*
并返回
void*
”的函数,它是一个函数指针。pfn这个名字是一个线索。具体来说,它是一个指向函数的指针,该函数接受一个“void指针”,但不返回任何内容。“void指针”是一种伪类型,可以转换为其他类型的指针


大多数C++书籍都详细地描述了空指针和函数指针。可能比必要的更详细,因为你可以写出完美的C++代码,而不需要使用任何代码。如果你的书都是超现代的,没有涵盖它们,那就找一本C参考书

CreateThread的声明指出第一个参数
pfn
是指向回调函数的指针,该回调函数将由
CreateThread
使用。回调
pfn
是您自己的函数,
CreateThread
将调用该函数,以便您可以在新线程中执行代码

你定义了一个函数

void MyThreadCallback(void* data)
{
    MyData myData = reinterpret_cast<MyData*>(data);
    ...
}

以便
CreateThread
可以在新线程的上下文中调用它。

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

void(*pfn)(void*)
这可以分解为:

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

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

void
(这是从函数返回的)

如果你有这样一个函数:

void DoSomeThing(void *data) {
  ... does something....
}
然后您可以将其传递到
CreateThread
函数中,如下所示

int i  = 99;
void * arg = (void*)&i;
pthread_t thread = CreateThread(DoSomeThing, arg, ... other parameters ...);
因此,在
CreateThread
中的某个地方,它将发出一个调用:

pfn(parg);
您的函数DoSomeThing将被调用,
void*data
将成为您传入的参数

更多信息:

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

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


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

这应该在任何一本像样的书中列出。但是,如果你还不知道它是什么,就没有简单的方法。如果你问我,C和C++中的函数指针语法真的很讨厌。好的问题——这就是“注释”的全部内容。
pfn(parg);