如何理解*(void **)(&m_handle)= dlsym(“ ./ haldle_lib.so”,“ custom_func”);

问题描述 投票:0回答:1

只想了解以下代码:

为什么我们使用选项(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)
    }
}
c++ c++11 pointers dlsym
1个回答
0
投票

不允许将类型为void*的指针转换为函数指针。换句话说,从C ++的角度来看,函数指针和对象指针不是同一件事。

在选项1中,窍门是您首先获取函数指针(&m_handle)的地址。然后,您假装此指针(即&m_handle)指向普通对象指针(类型为void *),而不指向函数指针。使用此指针((void **)(&m_handle)),您可以使用operator*对其进行引用,然后将dlsym(..)返回的值写入函数指针。

© www.soinside.com 2019 - 2024. All rights reserved.