我遇到了这段代码
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
将使用的回调函数的指针。回调pfn
是CreateThread
将调用的您自己的函数,以便您可以在新线程中执行代码。
您定义了一个函数
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参考书。