Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数指针:*(void**)(&;fun)=dlsym(lib,";fun";)它是如何工作的?_C++_Function Pointers_Void Pointers_Member Function Pointers_Dlsym - Fatal编程技术网

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

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. 有人能告诉我这种转换/铸造是如何发生的吗?演员说: 获取指向函数的指针 找到一个指

我使用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");
在任何平台上都可以正常工作,或者出现编译器错误。在具有非统一内存体系结构的平台上,您的狡猾的强制转换可能会导致未定义的运行时行为

演员说:

  • 获取指向函数的指针
  • 找到一个指向那个的指针
  • 假设指针指向常规对象指针(
    void*
    ),而不是函数指针
  • 通过该指针写入
    dlsym
    返回的地址,从而将函数指针设置为该地址
这解决了不能将函数指针指定给对象指针的限制(通常是需要的)。因为这是C++,你可以把它写成:

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指针
会绕过该转换,因此,如果转换非常重要,则可能会做错误的事情。