2

我正在使用 dlsym 填充函数指针,它是调用的成员变量。像下面

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

现在如果我分配

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

它给出了错误

通过互联网我发现

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

有人可以告诉我这种转换/转换是如何在这里发生的吗?

4

2 回答 2

4

剧组说:

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

这可以解决(通常是可取的)限制,即您不能将函数指针分配给对象指针。由于这是 C++,您可以将其编写为:

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

这可能更清楚一点:假装m_fun是 a void*,然后写信给它。

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

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

这将在任何平台上正常工作或给出编译器错误。您的狡猾演员可能会在具有非统一内存架构的平台上导致未定义的运行时行为。

于 2014-05-01T12:42:05.357 回答
0

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

于 2014-05-01T12:48:21.553 回答