2011-06-01 32 views
4

我碰到过这段代码有人可以解释参数void(* pfn)(void *)吗?

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

我不明白,这部分

void(*pfn)(void*) 

谁能告诉我这是什么意思/是什么?

这是btw未列入初学者的书籍,所以如果你想提及阅读书籍,它不在那里。

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

+4

这应该列在任何像样的书中。但是,如果你不知道它是什么,就没有简单的方法来找到它。 – SLaks 2011-06-01 21:59:38

+2

如果你问我,C和C++中的函数指针语法真的很讨厌。 – 2011-06-01 22:04:06

+0

好问题 - 这就是所有关于 – 2011-06-01 22:14:31

回答

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函数需要函数的地址,以便它可以在新线程中执行该函数。所以我们传递一个指向该函数的指针。因此,我们通过它函数指针

5

这叫做function pointer
它指向一个函数而不是一个变量。

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

9

这是一个函数指针,返回void并接受void *

void example(void *arg); 

您可以在The Function Pointer Tutorials找到更多关于函数指针在C++(和C中)的信息。

1

pfn是一个函数指针,其返回类型为无效和参数的类型是无效*

6

这些东西是最简单的读而外:

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

把它们放在一起,你有:

  • pfn是一个指向函数接受void *参数并返回void

注意,括号周围(*pfn)是因为优先级的必要。 void *pfn(void*)将被解释为好像它被写入(void *)pfn(void *):“pfn是接受void *并返回void *”的函数。

1

这是一个函数指针。名称pfn是一个线索。具体来说,它是一个指向一个函数的指针,它需要一个“void指针”并不返回任何内容。 “无效指针”是一种可以转换成其他类型指针的假类型。

大多数C++书籍都包含void指针和函数指针。可能比必要的更详细,因为你可以编写完美的C++代码而无需使用。如果您的书籍在某种程度上超级现代且不会涵盖它们,请查找C参考。

2

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

你定义一个函数

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

,并把它传递给CreateThread作为

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

使CreateThread可以称之为新线程的上下文。

相关问题