C++ 函数指针:*(void**)(&;fun)=dlsym(lib,";fun";)它是如何工作的?
我使用dlsym来填充函数指针,它是调用的成员变量。 如下C++ 函数指针:*(void**)(&;fun)=dlsym(lib,";fun";)它是如何工作的?,c++,function-pointers,void-pointers,member-function-pointers,dlsym,C++,Function Pointers,Void Pointers,Member Function Pointers,Dlsym,我使用dlsym来填充函数指针,它是调用的成员变量。 如下 class ABC { private: void (*m_fun) (int); } 现在如果我指定 m_fun = (void*) dlsym (libHandle, "fun") 这是错误的 我在网上找到的 *(void**) (&m_fun) = dlsym(libHandle, "fun") is working. 有人能告诉我这种转换/铸造是如何发生的吗?演员说: 获取指向函数的指针 找到一个指
class ABC {
private:
void (*m_fun) (int);
}
现在如果我指定
m_fun = (void*) dlsym (libHandle, "fun")
这是错误的
我在网上找到的
*(void**) (&m_fun) = dlsym(libHandle, "fun") is working.
有人能告诉我这种转换/铸造是如何发生的吗?演员说:
- 获取指向函数的指针
- 找到一个指向那个的指针
- 假设指针指向常规对象指针(
),而不是函数指针void*
- 通过该指针写入
返回的地址,从而将函数指针设置为该地址dlsym
reinterpret_cast<void*&>(m_fun) = dlsym(libHandle, "fun");
在任何平台上都可以正常工作,或者出现编译器错误。在具有非统一内存体系结构的平台上,您的狡猾的强制转换可能会导致未定义的运行时行为 演员说:
- 获取指向函数的指针
- 找到一个指向那个的指针
- 假设指针指向常规对象指针(
),而不是函数指针void*
- 通过该指针写入
返回的地址,从而将函数指针设置为该地址dlsym
reinterpret_cast<void*&>(m_fun) = dlsym(libHandle, "fun");
在任何平台上都可以正常工作,或者出现编译器错误。在具有非统一内存体系结构的平台上,您的狡猾的强制转换可能会导致未定义的运行时行为 Void*只是一个内存指针。要使用函数指针指向函数,首先需要指向实际函数的指针,其余指针(**)需要指向变量和函数体。Void*只是一个内存指针。要使用函数指针指向函数,首先需要指向实际函数的指针,其余指针(**)需要指向变量和函数体。我不想使用m_fun=(void*)(int)dlsym…..我不想使用m_fun=(void*)(int)dlsym…..如果函数指针和
void*
不能相互转换,该平台可能不会有任何dlsym
实现。@aschepper:确实如此。但是转换可能是非常重要的,在这种情况下,铸造赋值目标而不是dlsym
的结果可能会做错误的事情dlsym
is,并且POSIX需要将void*
转换为函数指针来工作。@larsmans:确实;但是*(void**)p=void\u指针会绕过该转换,因此如果转换是非平凡的,那么可能会做错误的事情。如果函数指针和void*
不能相互转换,那么该平台可能不会有任何dlsym
实现。@aschepler:确实如此。但是转换可能是非常重要的,在这种情况下,铸造赋值目标而不是dlsym
的结果可能会做错误的事情dlsym
is,并且POSIX需要将void*
转换为函数指针来工作。@larsmans:确实;但是*(void**)p=void\u指针
会绕过该转换,因此,如果转换非常重要,则可能会做错误的事情。