我使用dlsym来填充函数指针,它是call的成员变量。如下所示
class ABC {
private:
void (*m_fun) (int);
}
现在,如果我分配
m_fun = (void*) dlsym (libHandle, "fun")
它会给出错误
在互联网上我发现
*(void**) (&m_fun) = dlsym(libHandle, "fun") is working.
有人能告诉我这个转换/转换是怎么发生的吗?
发布于 2014-05-01 12:42:05
演员们说:
的指针
的指针
void*
)而不是函数指针这绕过了(通常需要的)限制,即不能将函数指针赋值给对象指针。由于这是C++,您可以将其编写为:
reinterpret_cast<void*&>(m_fun) = dlsym(libHandle, "fun");
这可能会更清楚一些:假设m_fun
是一个void*
,并写入它。
请注意,与将dlsym
的结果转换为正确的类型并将其赋值相比,这种方法的可移植性较差:
m_fun = reinterpret_cast<void(*)(int)>(dlsym(libHandle, "fun"));
它可以在任何平台上正常工作,或者会出现编译器错误。在具有非统一内存架构的平台上,不可靠的强制转换可能会导致未定义的运行时行为。
发布于 2014-05-01 12:48:22
Void*只是一个内存指针。要使用函数指针指向一个函数,首先需要一个指向实际函数的指针,其余的指针(**)需要指向变量和函数体。
https://stackoverflow.com/questions/23407808
复制相似问题