C++ 从‘;无效*’;至‘;无效*(*)(无效*)&x2019;c++;?

C++ 从‘;无效*’;至‘;无效*(*)(无效*)&x2019;c++;?,c++,pthreads,C++,Pthreads,我正在尝试使用pthread_create(),但它总是给我这个错误,从void*到void*(*)(void*) 这个错误在第三个参数中。有人能帮我解决这个错误吗 void Print_data(void *ptr) { cout<<"Time of Week = " <<std::dec<<iTOW<<" seconds"<<endl; cout<<"Longitude = "<<lon<

我正在尝试使用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*ptr){

cout您必须返回
void*

void* Print_data(void *ptr) {
满足需求

要传递的函数的签名为

void* function(void*);
然后使用调用
pthread\u create

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

错误在于,当
pthread\u 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++库有很多其他问题;特别是对于可移植性,线程输入函数应该是“代码>外部”C”/代码>。.

您正在尝试将函数指针转换为
void*
此处:
(void*)和打印数据

根据
pthread\u create
的要求,您需要传入一个函数,该函数接受
void*
并返回
void*

void* Print_data(void *ptr) {
所以你的函数签名应该是

void* Print_data(void *ptr) 
你的电话应该是

pthread_create(&thread, NULL, &Print_data, NULL);
将第三个参数视为

int pthread_create(pthread_t *thread,
                   const pthread_attr_t *attr,
                   void *(*start_routine)(void*),
                   void *arg);
这,
void*(*start_例程)(void*)
是指向函数的指针,该函数接受
void*
指针并返回
void*
指针

当您打印数据并将指针转换为
void*
时,意味着您正在传递类型为
void*
的指针,而不是类型为
void*(*start_例程)(void*)
[函数指针]的指针

为了正确,您需要将返回类型设置为
void*
,并将调用设置为
pthread\u create(&thread,NULL,&Print\u data,NULL);
添加头文件#include
编译g++-lpthread

首先为什么要强制转换到
(void*)
?听起来你不需要强制转换到void*,因为它需要一个指向返回void的函数的指针?标题是
void*(*)(void*)
,但描述是
void*()(void)
-哪一条是正确的错误消息?请澄清,因为我刚刚拒绝了一个猜测的编辑。@Philipp,他们都说了同样的话,但有一条被解释为markdown。正确的形式显然是没有被markdown破坏的形式,并且与
pthread\u create
cough
PrintData
应该是
extern“C”
文件,也不会编译(或者至少不会干净),因为
pthread\u create
需要一个返回
void*
值的函数,而函数
Print\u data
被声明为
void Print\u data
——在
void
之后添加一个
*
,并在函数的末尾返回NULL;
相对容易修复。@Matsbeterson:因此t行。我已经添加了更多的说明,以防其他人发现。为了避免崩溃,请记住加入()你的线程,否则你可能什么都看不到。根据标准,
Print\u data
也必须是
extern“C”否则,代码不应该编译,即使一些广泛使用的C++编译器宁愿忽略标准,也不发布诊断。@ ZEAD。它没有那么多代码:pthRead Soin(线程,0);如果您使用pthreads,您可能会选择这样做。添加头文件#包含并编译g++-lpthread这应该只是一个注释,而不是完整的答案