C ++ pthreads - используя код, который я использовал в C, я получаю ошибку преобразования - PullRequest
2 голосов
/ 19 февраля 2010

Я использую тот же самый точный код, который я использовал в простом C:

pthread_create(&threads[i], &attr, SomeMethod, ptrChar);

И я получаю ошибки:

ошибка: недопустимое преобразование из 'void * (*)(char'*)' to 'void*(*)(void*) '

ошибка: инициализация аргумента 3' int pthread_create(__pthread_t**, __pthread_attr_t* conts*, void*(*)(void*), void*)'

SomeMethod:

void *SomeMethod(char *direction)

Нужно ли делать что-то другое вC ++? Я думал, что вы можете просто запустить любой код C на C ++, и он будет работать нормально?

Я сейчас использую Cygwin.

Ответы [ 2 ]

5 голосов
/ 19 февраля 2010

Как говорится, это две разные сигнатуры функций. Вы должны сделать:

void *SomeMethod(void* direction) // note, void
{
    char* dir = static_cast<char*>(direction); // and get the value
}

C, по-видимому, приводил от одного указателя функции к другому. Приведение одного указателя на функцию - неопределенное поведение в C ++.

Тем не менее, я почти уверен, что POSIX требует, чтобы приведение между указателями функций было четко определено, поэтому вы можете сделать это вместо этого:

pthread_create(&threads[i], &attr, // cast the function pointer
                reinterpret_cast<void* (*)(void*)>(SomeMethod), ptrChar);
4 голосов
/ 19 февраля 2010

Ваша функция потока должна быть:

void *SomeMethod(void *direction);

И вы можете приводить из void * к char * внутри функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...