[英]invalid conversion from ‘void*’ to ‘void* (*)(void*)’ c++?
我试图使用pthread_create()但它总是给我这个错误无效转换从void*
到void* ( * )(void*)
此错误在第3个参数中。 有人可以帮我解决这个错误吗?
void Print_data(void *ptr) {
cout<<"Time of Week = " <<std::dec<<iTOW<<" seconds"<<endl;
cout<<"Longitude = "<<lon<<" degree"<<endl;
cout<<"Latitude = "<<lat<<" degree"<<endl;
cout<<"Height Above Sea = "<<alt_MSL<<" meters"<<endl;
}
int call_thread()
{
pthread_create(&thread, NULL, (void *) &Print_data, NULL);
return 0;
}
当pthread_create
需要该参数的函数指针时,错误是您将函数指针( void* (*)(void*)
)转换为对象指针( void*
)。 没有隐式转换来撤消你已经完成的狡猾的转换,因此错误。
答案是不这样做:
pthread_create(&thread, NULL, &Print_data, NULL);
并且您还需要修改Print_data
以返回void*
以匹配Posix线程接口:
void *Print_data(void *ptr) {
// print stuff
return NULL; // or some other return value if appropriate
}
正如评论中所指出的,直接从C ++使用这个C库还有其他各种问题。 特别是,为了便于携带,线程入口函数应该是extern "C"
。 就个人而言,我建议使用标准的C ++线程库(或Boost的实现,如果你坚持使用2011年之前的语言版本)。
您正在尝试将函数指针转换为void*
here: (void *) &Print_data
根据pthread_create
你需要传入一个带有void*
的函数并返回一个void*
所以你的功能签名应该是
void* Print_data(void *ptr)
你的电话应该是
pthread_create(&thread, NULL, &Print_data, NULL);
pthread_create
将第三个参数作为
int pthread_create(pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine)(void*),
void *arg);
这, void *(*start_routine)(void*)
是一个指向函数的指针,该函数接受void*
指针并返回void*
指针。
当您执行&Print_data
并将指针转换为void *
,这意味着您传递的是void*
类型的指针,而不是类型为void *(*start_routine)(void*)
[函数指针]的指针。
要正确,您需要将返回类型设置为void*
并将调用作为pthread_create(&thread, NULL, &Print_data, NULL);
你必须返回void*
void* Print_data(void *ptr) {
满足需求。
要传递的函数的签名是
void* function(void*);
然后使用调用pthread_create
pthread_create(&thread, NULL, &Print_data, NULL);
添加头文件#include并编译g ++ -lpthread
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.