c++从' void* '到' void* (*)(void*) '的转换无效
invalid conversion from ‘void*’ to ‘void* (*)(void*)’ c++?
我试图使用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
- Boost buffer_cast 无法从 void* 转换为 PointerToPodType
- 将void*转换为某种类型的shared_ptr
- 如何将 void* 转换为函数指针?
- 对 C++ 中的特定标头使用 extern C 关键字是否允许从 void* 转换为 char*?
- 如何将 void 转换为 typedef void(..)(浮动)
- 无法将参数 1 从"int (__thiscall A::* *)(void)"转换为"int (__cdecl *)(void)"
- 从 'void *' 转换为 'const std::string *&' 必须具有所有中间指针 const 合格
- x = malloc(n * sizeof (int));无法将 void 转换为 int
- 错误:请求从“ void”转换为“ QString”的非量表类型
- 使用 LLVM 从 const void * 转换为模板类型时出现问题
- 如何修复错误:请求从"void"转换为非标量类型"std::vector<int>"
- void* 转换为基类并调用虚函数
- 将 void* 转换为 std::function<void()>
- 无法将参数 4 从 'void' 转换为'const char *'
- C++11 无法将 std::condition_variable::wait 从 'void' 转换为 'bool'
- 如何在 C++11 中将"const void*"转换为函数指针?
- 似乎无法在 c++ 中将 void* 转换为结构
- 将 void 转换为字节
- void * 转换为 int 语法的问题
- C++从类型“void*”转换为类型“double”无效