-педантичное предупреждение и pthread_create

Я новичок в мире ansi и iso, я скомпилировал свою программу с помощью:

-asni -pedantic -std=c++11 -std=c++98 

Теперь я получаю следующее предупреждение:

 warning: converting from 'void (NetworkSocket::*)()' to 'void* (*)(void*)' [-pedantic]

для следующей строки:

if (pthread_create(this->threadArray, NULL, (void*(*)(void*)) &NetworkSocket::threadProcedure  , (void *)this) != 0)
        { /* error */      }

Как я могу пройти педантичный предупреждение?


person Community    schedule 28.07.2012    source источник
comment
Во-первых, отбросьте два из трех: -ansi -std=c++11 -std=c++98, потому что -ansi и -std=c++98 одинаковы, а std=c++11 конфликтует с двумя другими.   -  person rubenvb    schedule 28.07.2012
comment
Как насчет того, чтобы сделать NetworkSocket::threadProcedure статическим?   -  person Vaughn Cato    schedule 28.07.2012
comment
Хороший вопрос, это просто процедура потока. Если по какой-то причине вам нужен доступ к члену экземпляра и вы не можете использовать параметр дополнительных данных, std::bind — ваш лучший вариант. Если нет, перейдите к статической функции.   -  person chris    schedule 28.07.2012
comment
@chris, как передать выражение привязки pthread_create?   -  person Jonathan Wakely    schedule 28.07.2012
comment
@JonathanWakely, хороший вопрос. Я забыл, что он не может взять их. Угадайте, если вам нужно более одной части дополнительных данных, указатель на структуру, содержащую и то, и другое?   -  person chris    schedule 28.07.2012


Ответы (1)


pthread_create — это функция C, ожидающая, что функция C примет указатель void и вернет указатель void. Таким образом, вы можете использовать такую ​​функцию C для отправки вызова вашей функции-члена, если вы используете указатель this в качестве аргумента потока:

extern "C" void* startThread( void* p )
{
    static_cast< NetworkSocket* >( p )->threadProcedure();

    return 0;
} 

if ( pthread_create( this->threadArray, 0, startThread, this ) )
   ...
person Torsten Robitzki    schedule 28.07.2012
comment
Использование C-связи (часть extern "C") не требуется. Кроме того, внутри класса можно использовать функцию, если это статическая функция (с сигнатурой void* (*fn)(void*)). - person Giel; 28.07.2012
comment
@Giel: хотя функция без связи extern "C" будет работать почти во всех случаях, строго говоря, она является необходимой (ABI языков C++ и C не обязательно должны быть одинаковыми для бесплатных функций, хотя они почти всегда совпадают - аналогично для статических функций-членов). Даже если вас не волнует обоснование языкового юриста, поскольку нет ничего плохого в том, чтобы иметь extern "C", и он точно описывает то, что предназначено, его следует использовать. Особенно, если вас интересуют -pedantic предупреждения... - person Michael Burr; 29.07.2012
comment
@Giel: Это распространенное заблуждение. Вы не можете не использовать статические функции-члены. К сожалению, так делают многие, и это seems работает. Проблема в том, что библиотека pthread является библиотекой C и ничего не понимает в C++, поэтому технически может вызывать только функции C. Вызов функций C++ не переносим, ​​и им просто повезло on that particular compiler, что для функции C используется то же соглашение о вызовах, что и для статической функции-члена C++. В стандарте нет требования, чтобы это было правдой (и я знаю несколько платформ, где это не так). - person Martin York; 31.07.2012