Различия между Pthread в C и переполнением стека

Таким образом, я смог передать функцию 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 ++?

1

Решение

Неявные преобразования типов в C ++ намного строже, чем в C. void * function параметр не может использоваться как указатель на функцию в C ++ или C …

Тебе нужно void* (*function)(void*) в вашей функции прототип.

10

Другие решения

Как упомянуто KIIV неявные преобразования типов в C ++ намного строже, чем в C.

void* (*function) (void*)

Это указатель на функцию, которая принимает один void* аргумент и возврат void*,

Чтобы избавиться от ваших ошибок в C ++, измените вашу функцию, чтобы вернуть void *и передать его без приведения типа. Возврат из функции потока может быть простым возвратом NULL если вы не заботитесь о ценности.

Существуют различные другие проблемы с использованием этой библиотеки C непосредственно из C ++; в частности, для переносимости функция входа в поток должна быть extern "C", Хорошей практикой должно быть использование стандартной библиотеки потоков C ++ (или реализации Boost, если вы застряли в версии языка до 2011 года).

1