所以我能够使用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 ++中编译?
答案 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年之前的语言版本)。