2013-09-06 2 views
1

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

Вы можете просто использовать ссылку 'extern 'C" 'и оставить свой код C – mvp

+0

В соответствии с документацией' _beginthread' в MSDN параметр для подпрограммы потока является 'void *' не 'void'. Возможно, С больше прощает об этом. – lurker

+0

Что такое подпись для функции _beginthread? –

ответ

0

Try:

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

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


Если вы собираетесь принять этот ответ, я был бы признателен за причину. Я знаю, было бы намного лучше, если бы пользователь2754070 хотел изменить прототип services (см. Мои комментарии ниже). Тем не менее, то, что я предлагаю, работает (ответ был принят), и, насколько мне известно, безопасная и стандартная практика в библиотеках C-нерестов. Если вы считаете, что это не так, объясните, почему, и я подумаю об удалении ответа.

+0

Кастинг функции - ужасная идея, вы, скорее всего, оставите стек вызовов в коррумпированном состоянии. – molbdnilo

+0

@molbdnilo, пожалуйста, объясните и дайте ответ. Передача общих указателей функций на такие функции, как '_beginthread',' pthread_create' и т. Д., Является стандартной процедурой и может включать в себя литье типов. Я не понимаю, почему это не безопасно. – nickie

+0

@molbdnilo, ваш ответ правильный (и +1), но скажите, ради аргумента, что вы не можете изменить прототип для 'services'.Что случилось с тем, что я предлагаю? – nickie

1

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

3

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

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

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

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

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

Компилятор помогает вам здесь - не пытаться работать вокруг него, лежа на ней.

Смежные вопросы