Possible Duplicate:
void pointers: difference between C and C++
嗨,我有以下功能:
void task2(int a)
{
printf(" Task 2 running..\n");
sleep(2);
printf(" Task 2 exiting..\n");
}
thpool_add_work(threadpool, (void*)task2, (void*)a);
int thpool_add_work(thpool_t* tp_p, void *(*function_p)(void*), void* arg_p)
{
// some code here
}
上面的代码在 C 中运行良好,但在 C++ 中无法编译。我收到以下错误:
error: invalid conversion from ‘void*’ to ‘void* (*)(void*)’
error: initializing argument 2 of ‘int thpool_add_work(thpool_t*, void* (*)(void*), void*)’
我无法找出此错误的原因。知道为什么当我将文件扩展名更改为 CPP 并编译时会出现此错误吗?
最佳答案
您必须更改 task2
的签名以匹配 thpool_add_work
参数的类型:
void* task2(void* a)
创建线程的调用将变为
thpool_add_work(threadpool, task2, &a);
假设a
是int
。
如果您需要使用task2
的参数,您可以执行以下操作:
int ia = *(int*)a;
更新以回答OP评论
thpool_add_work
出于某种原因需要一个带有 void*
参数的函数。通过这种方式,您可以将任何类型的参数传递到线程函数中,尽管是以类型不安全的方式。
您将转换为 void*
的参数地址作为 thpool_add_work
的第三个参数传递。然后,将指向 void
的指针转换回指向预期参数类型的指针,并取消引用它以获取参数的值。我在上面给出了 int a
的示例,现在它如何查找 float :
void* test3(void* a)
{
float fa = *(float*)a;
.....
return NULL;
}
关于C++ 类型转换错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12721627/