函数指针:*(void **)(& fun)= dlsym(lib,“fun”)它的工作原理如何?

时间:2014-05-01 12:36:37

标签: c++ function-pointers void-pointers member-function-pointers dlsym

我正在使用dlsym来填充函数指针,它是call的成员变量。 如下所示

class ABC {
private: 
    void (*m_fun) (int);
}

现在如果我分配

m_fun = (void*) dlsym (libHandle, "fun") 

它给出了错误

通过互联网我找到了

*(void**) (&m_fun) = dlsym(libHandle, "fun") is working. 

有人能告诉我这次转换/演员是如何发生的吗?

2 个答案:

答案 0 :(得分:4)

演员说:

  • 获取指向函数的指针
  • 获取指向该
  • 的指针
  • 假装指针指向常规对象指针(void*)而不是函数指针
  • 通过该指针写入dlsym返回的地址,从而将函数指针设置为该地址

这适用于(通常需要的)限制,您无法将函数指针指定给对象指针。由于这是C ++,您可以将其写为:

reinterpret_cast<void*&>(m_fun) = dlsym(libHandle, "fun");

可能更清楚:假装m_funvoid*,然后写信给它。

请注意,这比将dlsym的结果转换为正确的类型并分配它更不便携了:

m_fun = reinterpret_cast<void(*)(int)>(dlsym(libHandle, "fun"));

将在任何平台上正常工作或给出编译器错误。您的dodgier强制转换可能会在具有非统一内存体系结构的平台上导致未定义的运行时行为。

答案 1 :(得分:0)

Void *只是一个内存指针。要使用函数指针指向函数,首先指向实际函数,指针的其余部分(**)需要指向变量和函数体。