【发布时间】:2016-12-17 06:56:13
【问题描述】:
所以我能够使用 Ada_function'Address 将 Ada 函数传递给 C_function。这是 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++ 中?
【问题讨论】:
-
可能是因为 C 和 C++ 是不同的语言?相同的语法并不意味着相同的语义。
-
您不应将指向函数的指针视为指向对象的指针——即使在 C 语言中也不保证它们的大小相同(尽管它们通常大小相同)。 C++ 对这些问题比较挑剔。您必须将
void *显式转换为所需的类型,而C 会随意为您执行此操作——C++ 程序员有时对C 持怀疑态度的原因之一。简而言之,有很多 C 代码不是有效的 C++ 代码;您的函数就是此类代码的一个示例。 -
您的 C 函数似乎并没有比直接使用
pthread_create()增加任何价值。实际上,您丢失了线程 IDpthread_t。 -
@SimonWright 是的,我知道。其余的功能并不完全相同。这更多是为了清楚起见。
-
出于好奇,将地址传递给 Ada 函数到 pthread 中而不是使用原生 Ada 线程(任务)有什么意义?