用于create_pthread()调用的cast成员函数
我想停止警告
server.cpp:823:警告:从’void *(ClientHandler :: )()’转换为’void ( )(void )’
在电话中:
pthread_create(th, NULL, (void* (*)(void*)) &ClientHandler::handle, (void *) clientHandler);
其中handle()
是ClientHandler
的成员函数:
void* ClientHandler::handle();
我很难从编译器中解密函数类型的消息。
问题是:
- 我应该更改
handle()
接口吗? 我可以摆脱整体铸造吗? - 我应该改变演员吗? 到底是什么?
- 完全不同的东西?
你不能直接这样做,指向成员函数的指针不是函数的简单指针,不能直接交给C
回调。
你需要一个级别的间接:
void callHandle(void *data) { ClientHandle *h = static_cast(data); h->handle(); } pthread_create(th, 0, &callHandle, static_cast(handle));
有关更多信息/替代方案,请参阅C ++ FAQ的“ 指向成员的指针”部分。
有关callHandle
中callHandle
的有效性,请参阅此问题 。 当你调用callHandle
时(以及它实际上指向ClientHandle
的事实),你自己负责确保handle
仍然存活。
您需要将静态cdecl函数传递给此签名中给出的pthread_create
:
void* handler(void* data);
可选参数可用于将ClientHandler
对象传递给线程。
class ClientHandler() { public: static void* handle(void* data); } extern "C" { void* ClientHandler::handle(void* data) { ClientHandler* handler = reinterpret_cast(data) // fancy stuff with handler object here } } /* extern "C" */
如果您希望从ClientHandler
类的特定实例调用ClientHandler::handle
方法,那么遗憾的是它比您的示例更复杂,因为指向成员函数的指针通常与指向函数的指针不同。 有关以这种方式创建pthreads需要执行哪些操作的完整说明,请参见此处 。