2016-08-10 35 views
1

所以,我是能够通过使用Ada_function'Address到C_function的阿达功能。这里是C函数:差异用C对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 + +?

+5

可能是因为C和C++是不同的语言?相同的语法并不意味着相同的语义。 – Olaf

+5

你不应该处理函数指针作为指针指向的对象 - 他们都不能保证是相同的大小,即使在C(虽然他们通常是相同的大小)。 C++对这样的问题更加感兴趣;你必须明确地将'void *'转换为所需的类型,而C为你随便这么做 - 这是C++程序员有时对C持怀疑态度的原因之一。简单地说,有很多C代码是无效的C++代码;你的功能就是这样的代码的一个例子。 –

+0

你的C函数似乎没有直接使用'pthread_create()'增加任何值。事实上,你失去了线程ID'pthread_t'。 –

回答

10

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

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

+0

谢谢。直接和重点。 – user289882

1

如在C++中KIIV隐式类型转换可以提及的是比C.

void* (*function) (void*)

这是一个指针,指向这需要一个void*参数,并返回void*一个函数要严格得多。

为了摆脱在C++中的错误,改变你的函数返回void *,并把它传递没有类型转换它。如果您不关心该值,则线程函数的返回值可以简单地返回NULL

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

+0

我将如何创建一个运行用c时,我只有地址(指针)是从艾达传递函数标准线程库中的函数++线程? – user289882