C与C ++中Pthread之间的差异

时间:2016-08-10 18:33:03

标签: c++ c pthreads posix ada

所以我能够使用Ada_function'地址到C_function传递Ada函数。这是C函数:

void Create_Process(int * status, void * function) {
    pthread_t new_thread;

    //creating function with the given function and no arguments.
    *status = pthread_create(&new_thread, NULL, function, NULL);
}

这很好用。我的问题是当我尝试在C ++中使用相同的功能时。它在编译错误时失败了:

error: invalid conversion from ‘void*’ to ‘void* (*)(void*)’ [-fpermissive]
*status = pthread_create(&new_thread, NULL, function, NULL);

有什么理由可以在C中编译/编译而不是在C ++中编译?

2 个答案:

答案 0 :(得分:10)

C ++中的隐式类型转换比C语言严格得多。void * function参数不能用作C ++或C中的函数指针...

您的函数原型需要void* (*function)(void*)

答案 1 :(得分:1)

正如KIIV所提到的,C ++中的隐式类型转换比C中的要严格得多。

void* (*function) (void*)

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

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

直接从C ++使用这个C库还有其他各种问题;特别是,为了便于携带,线程入口函数应为extern "C"。好的做法应该是使用标准的C ++线程库(或者Boost的实现,如果你仍然坚持使用2011年之前的语言版本)。