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

时间:2011-06-01 21:56:01

标签: c++ pointers function-pointers

我遇到过这段代码

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

我不明白这部分

void(*pfn)(void*)

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

这是btw没有列在初学者的书中,所以如果你想提及阅读书籍,那就不存在了。

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

8 个答案:

答案 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参考。