C++ 有人能解释参数void(*pfn)(void*)吗?
我遇到了这段代码C++ 有人能解释参数void(*pfn)(void*)吗?,c++,pointers,function-pointers,C++,Pointers,Function Pointers,我遇到了这段代码 inline pthread_t CreateThread(void(*pfn)(void*), void* parg, bool fWantHandle=false) 我不明白这部分 void(*pfn)(void*) 有人能告诉我这是什么意思吗 这是顺便说一句,没有列出的书籍,为初学者,所以如果你想提到阅读书籍,它不存在 好的,void是一个函数的数据类型,意味着它不会返回任何东西,但是其中的那部分…void用于指针?这称为a。 它指向一个函数而不是一个变量 如果它不在
inline pthread_t CreateThread(void(*pfn)(void*), void* parg, bool fWantHandle=false)
我不明白这部分
void(*pfn)(void*)
有人能告诉我这是什么意思吗
这是顺便说一句,没有列出的书籍,为初学者,所以如果你想提到阅读书籍,它不存在
好的,void是一个函数的数据类型,意味着它不会返回任何东西,但是其中的那部分…void用于指针?这称为a。它指向一个函数而不是一个变量
如果它不在你的书中,你应该得到一本更好的书。它是一个函数指针,指向返回
void
并接受void*
的函数
void example(void *arg);
<>您可以在C++中(C中)找到更多关于函数指针的信息。( < p> <代码> pfn < /Cord>是一个函数指针,它的返回类型是“强>空< /强>,并且参数的类型是<强>空*>强> < p>这是一个返回的空格,并取一个(见空洞指针的部分)。.这些东西最容易从里到外阅读:
=>“(*pfn)
是指针”pfn
=>“void x(void*)
是一个接受x
参数并返回void*
的函数。”void
- “
是指向接受pfn
参数并返回void*
的函数的指针”void
请注意,
(*pfn)
周围的参数是必需的,因为优先级较高void*pfn(void*)
将被解释为它是被写入的(void*)pfn(void*)
:“pfn
是一个接受void*
并返回void*
”的函数,它是一个函数指针。pfn这个名字是一个线索。具体来说,它是一个指向函数的指针,该函数接受一个“void指针”,但不返回任何内容。“void指针”是一种伪类型,可以转换为其他类型的指针
大多数C++书籍都详细地描述了空指针和函数指针。可能比必要的更详细,因为你可以写出完美的C++代码,而不需要使用任何代码。如果你的书都是超现代的,没有涵盖它们,那就找一本C参考书
CreateThread的声明指出第一个参数pfn
是指向回调函数的指针,该回调函数将由CreateThread
使用。回调pfn
是您自己的函数,CreateThread
将调用该函数,以便您可以在新线程中执行代码
你定义了一个函数
void MyThreadCallback(void* data)
{
MyData myData = reinterpret_cast<MyData*>(data);
...
}
以便
CreateThread
可以在新线程的上下文中调用它。这是一个函数指针(或指向函数的指针)。
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
将成为您传入的参数
更多信息:
请记住,代码只是内存中的一个字节序列。cpu解释它们的方式使它们与我们称之为数据的东西不同
因此,在程序中的任何时候,我们都可以通过它的内存地址引用代码的另一部分。由于代码在C中被分解为函数,这是一个有用的重用单元,C可以理解并允许我们将函数的地址视为指向某些数据的另一个指针
在上面的示例中,CreateThread函数需要函数的地址,以便可以在新线程中执行该函数。我们给它传递一个指向该函数的指针。因此,我们给它传递一个函数指针。这应该在任何一本像样的书中列出。但是,如果你还不知道它是什么,就没有简单的方法。如果你问我,C和C++中的函数指针语法真的很讨厌。好的问题——这就是“注释”的全部内容。
pfn(parg);