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

时间:2013-06-17 12:37:15

标签: c++ pthreads

我正在尝试使用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;
  }

5 个答案:

答案 0 :(得分:16)

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年之前的语言版本)。

答案 1 :(得分:4)

您正在尝试将函数指针转换为void*(void *) &Print_data

根据pthread_create,你需要传递一个void*并返回void*

的函数

所以你的功能签名应该是

void* Print_data(void *ptr) 

你的电话应该是

pthread_create(&thread, NULL, &Print_data, NULL);

答案 2 :(得分:3)

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

答案 3 :(得分:2)

您必须返回void*

void* Print_data(void *ptr) {

满足需求。

要传递的函数的签名是

void* function(void*);

然后使用

致电pthread_create
 pthread_create(&thread, NULL, &Print_data, NULL);

答案 4 :(得分:0)

添加头文件#include 并编译g ++ -lpthread