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



我遇到了这段代码

inline pthread_t CreateThread(void(*pfn)(void*), void* parg, bool fWantHandle=false)

我不理解的这个部分

void(*pfn)(void*)

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

顺便说一句,这本书没有列在初学者的书中,所以如果你想提到读书,它不在那里。

当然,void是函数的数据类型,这意味着它不会返回任何内容,但其中的那个部分。。。指针上使用了void?

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

void example(void *arg);

您可以在函数指针教程中找到有关C++(和C)中函数指针的更多信息。

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

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将是您传入的arg

更多信息:

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

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

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

这些东西最容易从内而外阅读:

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

把它们放在一起,你就有了:

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

请注意,由于优先级的原因,(*pfn)周围的括号是必要的。void *pfn(void*)将被解释为它被写为(void *)pfn(void *):"pfn是一个接受void *并返回void *的函数"。

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

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

这是一个函数指针,不返回任何内容,并使用一个void指针(请参阅名为void pointers的部分)。

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

您定义了一个函数

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

并将其作为传递给CCD_ 29

MyData* myData = new MyData();
CreateThread(MyThreadCallback, myData, ... );

使得CCD_ 30可以在新线程的上下文中调用它。

pfn是一个函数指针,其返回类型为void,参数类型为void*

它是一个函数指针。pfn这个名字是一个线索。具体来说,它是一个指向函数的指针,该函数使用"void指针",但不返回任何内容。"void指针"是一种伪类型,可以强制转换为其他类型的指针。

大多数C++书籍都详细介绍了空指针和函数指针。可能比必要的更详细,因为您可以在不使用任何一种代码的情况下编写非常好的C++代码。如果你的书都是超现代的,而且没有涵盖它们,那就找一本C参考书。

相关内容

最新更新