错误:从‘void*’到‘void* (*)(void*)’的无效转换 - pthreads

Posted

技术标签:

【中文标题】错误:从‘void*’到‘void* (*)(void*)’的无效转换 - pthreads【英文标题】:error: invalid conversion from ‘void*’ to ‘void* (*)(void*)’ - pthreads 【发布时间】:2012-08-01 11:20:52 【问题描述】:
anisha@linux-y3pi:~> g++ conditionVarTEST.cpp -Wall

conditionVarTEST.cpp: In function ‘int main()’:
conditionVarTEST.cpp:33:53: error: invalid conversion from ‘void*’ to ‘void* (*)(void*)’
conditionVarTEST.cpp:33:53: error:   initializing argument 3 of ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)’
conditionVarTEST.cpp:34:53: error: invalid conversion from ‘void*’ to ‘void* (*)(void*)’
conditionVarTEST.cpp:34:53: error:   initializing argument 3 of ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)’

第 33 行是这样的:

pthread_create (&A, NULL, (void *) &functionA, NULL);

functionA的声明是这样的:

void functionA (void*);


它的定义是:

void functionA (void* argA)

    while (1)
    
        pthread_mutex_lock (&mutexA);

        if (count < 0)
        
            pthread_cond_wait (&conditionVariableA, &mutexA);
        
        else
        
            // Do something.
            std :: cout << "\nTime to enjoy!";
        
        pthread_mutex_unlock (&mutexA);
    

【问题讨论】:

【参考方案1】:

如果你查看manual page,你会看到函数参数是

void *(*start_routine) (void *)

即,指向一个函数的指针,该函数接受一个void * 参数并返回void *

要消除您的错误,请将您的函数更改为返回 void *,并在不进行类型转换的情况下传递它。如果你不关心值,线程函数的返回可以是一个简单的return NULL

【讨论】:

很抱歉没有看手册页。我跟着这个:amparo.net/ce155/thread-ex.html这给了我错误。 @AnishaKaul 如果您收到有关函数参数的编译错误,那么查看该函数的手册页以确保您获得正确的参数可能会有所帮助。【参考方案2】:

(void *) &amp;functionA 会将你的函数指针functionA 类型为void (*)(void*) 转换为简单的void*。后者不能再转换为第一个,所以编译器报错。这是您不应该使用 C 风格强制转换的原因之一。

请改用pthread_create (&amp;A, NULL, functionA, NULL);

另外,线程函数的返回类型应该是void*,而不是void。所以把void functionA(void*)改成void* functionA(void*)

【讨论】:

这给了我:error: invalid conversion from ‘void (*)(void*)’ to ‘void* (*)(void*)’ 更一般地说,void* 是指向数据的指针,void (*)(void*) 是指向函数的指针。两种类型之间没有没有合法的转换。【参考方案3】:

使用

pthread_create (&A, NULL, functionA, NULL); 

而不是强制转换。

您用来传递给 pthread_create 的函数也应该返回 void*,因此为避免以后出现任何问题,请考虑更改函数签名以适应这一点。

【讨论】:

【参考方案4】:

当您使用 C++ 编译器时,您应该使用带有 C 绑定的函数,因为 pthread_create 需要一个 C 函数:

extern "C" void* functionA (void*);

C++ 和 C 在您当前的平台上可能具有相同的调用约定,但不能保证在其他平台上会是这种情况,或者将来会是这样。

【讨论】:

以上是关于错误:从‘void*’到‘void* (*)(void*)’的无效转换 - pthreads的主要内容,如果未能解决你的问题,请参考以下文章

错误:从 'void*' 到 'node_t*' 的无效转换 [关闭]

qsort 给出 [错误]:从 `int (*)(cricketer*, cricketer*)' 到 `int (*)(const void*, const void*)' 的无效转换

带有 std::map 的模板函数给出错误:声明为 void 的变量或字段

抑制从 void ** 到另一个 ** 的隐式类型转换的警告的方法?

从函数回调推断泛型类型参数

在没有参数的函数中使用 void?