c++从' void* '到' void* (*)(void*) '的转换无效

invalid conversion from ‘void*’ to ‘void* (*)(void*)’ c++?

本文关键字:void 转换 无效 c++      更新时间:2023-10-16

我试图使用pthread_create(),但它总是给我这个错误无效转换从void*void* ( * )(void*)

这个错误在第三个参数中。有人能帮我解决这个错误吗?

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;
  }

错误是您将函数指针(void* (*)(void*))转换为对象指针(void*),当pthread_create期望该参数的函数指针时。没有隐式转换来撤销您所做的危险转换,因此出现错误。

答案是不这样做:

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*: (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