只想了解以下代码:
为什么我们使用选项(1)而不是选项(2)?我不知道(void **)在这里有什么用?真的很困惑。
Class Handle{
private:
int unique_id;
int (*m_handle)(int arg1, int arg2);
public:
bool init(){
*(void **)(&m_handle) = dlsym(dlopen(./haldle_lib.so, RTLD_NOW), "custom_func"); // (1)
//m_handle = (decltype(m_handle))dlsym(dlopen(./haldle_lib.so, RTLD_NOW), "custom_func");//(2)
}
}
不允许将类型为void*
的指针转换为函数指针。换句话说,从C ++的角度来看,函数指针和对象指针不是同一件事。
在选项1中,窍门是您首先获取函数指针(&m_handle
)的地址。然后,您假装此指针(即&m_handle
)指向普通对象指针(类型为void *),而不指向函数指针。使用此指针((void **)(&m_handle)
),您可以使用operator*
对其进行引用,然后将dlsym(..)
返回的值写入函数指针。