我遇到过这段代码
inline pthread_t CreateThread(void(*pfn)(void*), void* parg, bool fWantHandle=false)
我不明白这部分
void(*pfn)(void*)
有人可以告诉我这是什么意思吗?
这是btw没有列在初学者的书中,所以如果你想提及阅读书籍,那就不存在了。
Afaik,void是一个函数的数据类型,意味着它不会返回任何内容,但是那个部分......指针上是否使用了void?
答案 0 :(得分:9)
它是指向返回void
并接受void *
的函数的函数指针。
void example(void *arg);
您可以在The Function Pointer Tutorials找到有关C ++(以及C语言)中函数指针的更多信息。
答案 1 :(得分:6)
这些内容最简单易读:
(*pfn)
=> “pfn
是指针”void x(void*)
=> “x
是一个接受void *
参数并返回void
”的函数将它们放在一起,你就有了:
pfn
是指向接受void *
参数并返回void
”的函数的指针请注意,由于优先权,(*pfn)
周围的parens是必需的。 void *pfn(void*)
将被解释为写成(void *)pfn(void *)
:“pfn
是一个接受void *
并返回void *
”的函数。
答案 2 :(得分:6)
这是一个函数指针(或指向函数的指针)。
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函数需要一个函数的地址,因此它可以在一个新线程中执行该函数。所以我们传给它一个指向该函数的指针。因此我们传递一个函数指针。
答案 3 :(得分:5)
这称为function pointer 它指的是函数而不是变量。
如果它不在你的书中,你应该得到一本更好的书。
答案 4 :(得分:2)
这是一个function pointer,只返回void pointer(参见 void pointers 一节)。
答案 5 :(得分:2)
CreateThread
的声明表示第一个参数pfn
是指向CreateThread
将使用的回调函数的指针。回调pfn
是您自己的函数CreateThread
将调用,以便您可以在新线程中执行代码。
您定义了一个函数
void MyThreadCallback(void* data)
{
MyData myData = reinterpret_cast<MyData*>(data);
...
}
并将其作为
传递给CreateThread
MyData* myData = new MyData();
CreateThread(MyThreadCallback, myData, ... );
以便CreateThread
可以在新线程的上下文中调用它。
答案 6 :(得分:1)
pfn
是一个函数指针,其返回类型为 void ,参数的类型为 void *
答案 7 :(得分:1)
这是一个函数指针。名称pfn是一个线索。具体来说,它是一个指向函数的指针,该函数接受“void指针”并且不返回任何内容。 “void指针”是一种伪造类型,可以转换为其他类型的指针。
大多数C ++书籍都详细介绍了void指针和函数指针。可能更多细节而不是必要,因为你可以编写完美的C ++代码,而无需使用任何一种。如果您的书籍在某种程度上都是超现代的并且不覆盖它们,请寻找C参考。