C 与 C++ 中的 Pthread 之间的差异
Differences between Pthread in C vs C++
所以我能够使用 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 中严格得多。void * function
参数不能用作 C++ 或 C 中的函数指针...
您的函数原型中需要 void* (*function)(void*)
。
如 KIIV 所述,C++ 中的隐式类型转换比 C 中的隐式类型转换严格得多。
void* (*function) (void*)
这是一个指向函数的指针,该函数接受一个 void*
个参数和 return 个 void*
。
要消除 C++ 中的错误,请将函数更改为 return void *
,并在不进行类型转换的情况下传递它。如果您不关心值,线程函数中的 return 可以是一个简单的 return NULL
。
直接从 C++ 使用此 C 库还有其他各种问题;特别是,为了可移植性,线程入口函数应该是extern "C"
。好的做法应该是使用标准的 C++ 线程库(或者 Boost 的实现,如果你坚持使用 2011 之前的语言版本)。
所以我能够使用 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 中严格得多。void * function
参数不能用作 C++ 或 C 中的函数指针...
您的函数原型中需要 void* (*function)(void*)
。
如 KIIV 所述,C++ 中的隐式类型转换比 C 中的隐式类型转换严格得多。
void* (*function) (void*)
这是一个指向函数的指针,该函数接受一个 void*
个参数和 return 个 void*
。
要消除 C++ 中的错误,请将函数更改为 return void *
,并在不进行类型转换的情况下传递它。如果您不关心值,线程函数中的 return 可以是一个简单的 return NULL
。
直接从 C++ 使用此 C 库还有其他各种问题;特别是,为了可移植性,线程入口函数应该是extern "C"
。好的做法应该是使用标准的 C++ 线程库(或者 Boost 的实现,如果你坚持使用 2011 之前的语言版本)。