invalid conversion from ‘void*’ to ‘void* (*)(void*)’ 问题解决

来源:互联网 发布:php pdo查询数据库 编辑:程序博客网 时间:2024/06/05 19:14
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*)’


网上找了一个程序联系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()



1 0
原创粉丝点击