gpt4 book ai didi

c++ - 函数指针 : *(void**) (&fun) = dlsym (lib, "fun") 它是如何工作的?

转载 作者:搜寻专家 更新时间:2023-10-31 01:04:45 31 4
gpt4 key购买 nike

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

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

现在如果我分配

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

报错

我在网上找到的

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

谁能告诉我这种转换/转换是如何发生的?

最佳答案

Actor 说:

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

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

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

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

请注意,这不如将 dlsym 的结果转换为正确的类型并分配给它:

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

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

关于c++ - 函数指针 : *(void**) (&fun) = dlsym (lib, "fun") 它是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23407808/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com