有人能解释参数void(*pfn)(void*)吗
Can someone explain the parameter void(*pfn)(void*)?
我遇到了这段代码
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参考书。
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 在c++类上调用void函数
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 在派生函数中指定void*参数
- C++为什么尽管我调用了void函数,它却不起作用
- 如何从void函数输出字符串
- 我应该使用什么来代替void作为变体中的替代类型之一
- 奇怪的结构&GCC&clang(void*返回类型)
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 引用一个已擦除类型(void*)的指针
- 将尾部调用void(i32,..)位转换为llvm::函数以获取FnAttribute
- 库函数需要一个 std::function<void(void)>,如何传入类函数?
- 如何将指针从一个void函数传递到另一个C++
- 为什么我在使用void函数时得到错误代码C2276
- void*到驱动程序中的UnicodeString
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- 指针没有更新它在void函数内部指向的值
- 不能将 "void *" 类型的值分配给类型 "TCHAR" 的实体
- 有人能解释参数void(*pfn)(void*)吗