Таким образом, я смог передать функцию Ada с помощью Ada_function’Address в 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*
аргумент и возврат void*
,
Чтобы избавиться от ваших ошибок в C ++, измените вашу функцию, чтобы вернуть void *
и передать его без приведения типа. Возврат из функции потока может быть простым возвратом NULL
если вы не заботитесь о ценности.
Существуют различные другие проблемы с использованием этой библиотеки C непосредственно из C ++; в частности, для переносимости функция входа в поток должна быть extern "C"
, Хорошей практикой должно быть использование стандартной библиотеки потоков C ++ (или реализации Boost, если вы застряли в версии языка до 2011 года).