我正在使用 dlsym 填充函数指针,它是调用的成员变量。像下面
class ABC {
private:
void (*m_fun) (int);
}
现在如果我分配
m_fun = (void*) dlsym (libHandle, "fun")
它给出了错误
通过互联网我发现
*(void**) (&m_fun) = dlsym(libHandle, "fun") is working.
有人可以告诉我这种转换/转换是如何在这里发生的吗?
我正在使用 dlsym 填充函数指针,它是调用的成员变量。像下面
class ABC {
private:
void (*m_fun) (int);
}
现在如果我分配
m_fun = (void*) dlsym (libHandle, "fun")
它给出了错误
通过互联网我发现
*(void**) (&m_fun) = dlsym(libHandle, "fun") is working.
有人可以告诉我这种转换/转换是如何在这里发生的吗?
剧组说:
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"));
这将在任何平台上正常工作或给出编译器错误。您的狡猾演员可能会在具有非统一内存架构的平台上导致未定义的运行时行为。
void* 只是一个内存指针。要使用函数指针指向函数,首先需要一个指向实际函数的指针,然后需要指针的其余部分 (**) 指向变量和函数体。