Явное приведение типов в переполнении стека

Я пытаюсь преобразовать 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*)

Я в замешательстве, надеюсь, вы, ребята, дадите мне понять 🙂

1

Решение

Пытаться:

_beginthread((void(_cdecl*)(void*)) services, 0, NULL);

То, что вы делали, явно приводило указатель функции к нефункциональному типу указателя (void *). Это было хорошо. Но _beginthread В качестве первого параметра функция ожидает указатель на функцию правильного типа, указанного в сообщении об ошибке. Так что вам нужно исправить свой актерский состав.


Если вы собираетесь понизить этот ответ, я хотел бы знать причину. Я знаю, что было бы намного лучше, если бы user2754070 захотел изменить прототип services (см. мои комментарии ниже). Однако то, что я предлагаю, работает (ответ был принят) и, насколько я знаю, это безопасная и стандартная практика в библиотеках Си, порождающих потоки. Если вы считаете, что это не так, объясните почему, и я рассмотрю вопрос об удалении ответа.

0

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

Решение состоит в том, чтобы использовать функции правильного типа и не брось их. Игнорируйте параметр, если он не имеет отношения к коду.

void services(void*);
void transfers(void*);

_beginthread(services, 0, NULL);
_beginthread(transfers, 0, NULL);

Если вы абсолютно не можете изменить функции, например, если у вас нет доступа к источникам, используйте оболочки:

void correct_services(void*) { services(); }
_beginthread(correct_services, 0, NULL);

Компилятор вам здесь помогает — не пытайтесь обойти это, обманывая его.

3

Похоже, вы пытаетесь преобразовать стандарт вызова C ++ в стандарт вызова C. cdecl означает C-объявление.
Чтобы вручную определить функцию для cdecl, вы можете использовать void _cdecl funct();

1
По вопросам рекламы [email protected]