invalid conversion from ‘void*’ to ‘void* (*)(void*)’ 问题解决
来源:互联网 发布:php pdo查询数据库 编辑:程序博客网 时间:2024/06/05 19:14
pthread.cpp:11: error: invalid conversion from ‘const void*’ to ‘void*’
pthread.cpp:11: error: initializing argument 1 of ‘void pthread_exit(void*)’
pthread.cpp: In function ‘int main()’:
pthread.cpp:24: error: invalid conversion from ‘void*’ to ‘void* (*)(void*)’
pthread.cpp:24: error: initializing argument 3 of ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)’
网上找了一个程序联系pthread
原程序
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
void thread1(char s[])
{
printf("This is a pthread1.\n");
printf("%s\n",s);
pthread_exit(“hello”); //结束线程,返回一个值。
}
/**************main function ****************/
int main()
{
pthread_t id1;
void *a1;
int i,ret1;
char s1[]="This is first thread!";
ret1=pthread_create(&id1,NULL,(void *)thread1,s1);
if(ret1!=0){
printf ("Create pthread1 error!\n");
exit (1);
}
pthread_join(id1,&a1);
printf("%s\n",(char*)a1);
return (0);
}
本意是为了练习pthread_join()的第二个参数的作用,设置了 pthread_exit(“hello”); 来传入第二个参数;
但是编译时遇到了之前没有遇到的问题;
pthread.cpp: In function ‘void thread1(char*)’:
pthread.cpp:11: error: invalid conversion from ‘const void*’ to ‘void*’
pthread.cpp:11: error: initializing argument 1 of ‘void pthread_exit(void*)’
pthread.cpp: In function ‘int main()’:
pthread.cpp:24: error: invalid conversion from ‘‘void *‘ to ‘void* (*)(void*)’
pthread.cpp:24: error: initializing argument 3 of ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)’
原因就是C语言编译器允许隐含性的将一个通用指针转换为任意类型的指针,包括const *而C++不允许将const 转换为非const*,所以出错。
所以要按照符合函数声明的本来面目修改出错函数的形参输入与返回值
对照这里,需要修改的有两个地方,一个是pthread_exit(void*)’,一个是‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)
第一,对于pthread_exit(),我们原来的输入是一个字符串常量,它默认是const char*类型,不能修改;所以我们要改为
char* p="hello";
虽然hello 依然为常量,但是却把它的地址赋值给p,只不过p指向的区域不能修改;修改则会出错;所以这么一改,可以通过编译;
关于字符串常量指针,我有转帖专门说明这类问题;
第二,对于int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)
第三个参数应该为void* (*)(void*),即一个此类型的函数指针,如果输入的thread1恰好为此类型的话,即可编译通过,很显然thread1为‘void (*)(char*),但是在调用pthread_create处,即使将thread1强制转换为void*依然满足不了要求;原因见前述;
所以此处不能强制转换;应该在调用处输入thread1,同时修改thread1的定义,变为void *thread1(void*s)
这样依然可以通过void*s将字符串参数s1传入进去,原因是void*可以任意转换,但是却不能任意转换为const void*;这里不要求const,所以通过
。
修改后的程序
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
void* thread1(void* s)
{
printf("This is a pthread1.\n");
printf("%s\n",s);
char* p;
p = "hello";
pthread_exit(p); //结束线程,返回一个值。
}
/**************main function ****************/
int main()
{
pthread_t id1;
void *a1;
int i,ret1;
char s1[]="This is first thread!";
//ret1=pthread_create(&id1,NULL,(void *)thread1,s1);
ret1=pthread_create(&id1,NULL,thread1,s1);
if(ret1!=0){
printf ("Create pthread1 error!\n");
exit (1);
}
pthread_join(id1,&a1);
printf("%s\n",(char*)a1);
return (0);
}
输出结果为:
This is a pthread1.
This is first thread!
hello
pthread_join()的第二个参数抓住了“hello”通过pthread_exit()
- invalid conversion from ‘void*’ to ‘void* (*)(void*)’ 问题解决
- invalid conversion from 'void* (*)()' to 'void* (*)(void*)'
- invalid conversion from ‘void*’ to ‘void* (*)
- invalid conversion from `void*' to `SeqList*
- 一个建立线程时常见的问题:invalid conversion from `void*' to `void*(*)(void*)
- 一个建立线程时常见的问题:invalid conversion from `void*' to `void*(*)(void*)
- 一个建立线程时常见的问题:invalid conversion from `void*' to `void*(*)(void*)
- 一个建立线程时常见的问题:invalid conversion from `void*' to `void*(*)(void*)
- 一个建立线程时常见的问题:invalid conversion from `void*' to `void*(*)(void*)
- c++创建线程的常见问题:error: invalid conversion from 'void*' to 'void* (*)(void*)'
- ip_tables.h:217: error:invalid conversion from 'void*' to 'xt_entry_target*'
- 使用dlsym时出现invalid conversion from void* to
- 【Linux开发技术之常见问题】一个建立线程时常见的问题:invalid conversion from `void*' to `void*(*)(void*)
- 【Linux开发技术之常见问题】一个建立线程时常见的问题:invalid conversion from `void*' to `void*(*)(void*)
- 【Linux开发技术之常见问题】一个建立线程时常见的问题:invalid conversion from `void*' to `void*(*)(void*)
- 解决“invalid conversion from void* to char*”和“deprecated conversion from string constant to 'char*' "
- 允许int*到void*的转换,反之不亦然:无效的转换invalid conversion from `void*' to `int*'
- C++之‘malloc’ was not declared in this scope和invalid conversion from ‘void*’ to ‘char*’
- Windows 8.1内置微软五笔输入法
- TreeSet的排序
- ANR---android程序架构时必须考虑的问题
- 如何使用SWFTools 命令 将pdf文件转换为swf文件,并进行在线浏览该pdf文件
- 深度优先搜索----部分和问题
- invalid conversion from ‘void*’ to ‘void* (*)(void*)’ 问题解决
- Mapinfo Sql语句查询方法
- Makefile and Paul's Rules of Makefiles
- git remote添加本地库的方法
- 基础总结篇之一:Activity生命周期
- [VNC] CentOS6.5中VNC无法启动服务的一种可能解决方案
- java命名规范,action中变量写了getset方法,页面取不到值
- Web数据库框架
- ARM 程序状态寄存器的结构