Я пытаюсь преобразовать C
код для C++
, В моем файле .c у меня есть такие определения:
void services(void);
void transfers(void);
Более того, поток инициализирует два вышеуказанных кода следующим образом:
_beginthread((void*) services,0,NULL);
_beginthread((void*) transfers,0,NULL);
Когда я пытаюсь скомпилировать, я получаю следующую ошибку в обоих местах выше, как это:
Conversion from void* to pointer to non-void required an Explicit cast: Cannot convert parameter 1 from void* to void(_cdecl*)(void*)
Я в замешательстве, надеюсь, вы, ребята, дадите мне понять 🙂
Пытаться:
_beginthread((void(_cdecl*)(void*)) services, 0, NULL);
То, что вы делали, явно приводило указатель функции к нефункциональному типу указателя (void *
). Это было хорошо. Но _beginthread
В качестве первого параметра функция ожидает указатель на функцию правильного типа, указанного в сообщении об ошибке. Так что вам нужно исправить свой актерский состав.
Если вы собираетесь понизить этот ответ, я хотел бы знать причину. Я знаю, что было бы намного лучше, если бы user2754070 захотел изменить прототип services
(см. мои комментарии ниже). Однако то, что я предлагаю, работает (ответ был принят) и, насколько я знаю, это безопасная и стандартная практика в библиотеках Си, порождающих потоки. Если вы считаете, что это не так, объясните почему, и я рассмотрю вопрос об удалении ответа.
Решение состоит в том, чтобы использовать функции правильного типа и не брось их. Игнорируйте параметр, если он не имеет отношения к коду.
void services(void*);
void transfers(void*);
_beginthread(services, 0, NULL);
_beginthread(transfers, 0, NULL);
Если вы абсолютно не можете изменить функции, например, если у вас нет доступа к источникам, используйте оболочки:
void correct_services(void*) { services(); }
_beginthread(correct_services, 0, NULL);
Компилятор вам здесь помогает — не пытайтесь обойти это, обманывая его.
Похоже, вы пытаетесь преобразовать стандарт вызова C ++ в стандарт вызова C. cdecl означает C-объявление.
Чтобы вручную определить функцию для cdecl, вы можете использовать void _cdecl funct();