将dlsym返回的void*解释为函数指针的C++方法是什么



假设一个动态库导出一个函数,例如void()类型的函数,名为foo。客户端代码可以像下面的代码片段一样使用它(为了简单起见,假设foo是通过extern "C" void foo();公开的(

#include "Foo.hpp" // defines the type of foo
// dlopen a library and check it was found
// look for a symbol foo in a library lib
void * fooPtr = dlsym(lib, "foo");
// if reading the symbol succeeded
if (!dlerror()) {
// use it
using Foo = decltype(foo);
((Foo*)fooPtr)();
}

我知道static_cast在这里是不可用的,但上面的C型铸造是可行的吗?

C样式转换在C++的旧版本中是必需的。由于C++11,从对象指针到函数指针类型的reinterpret_cast是有条件支持的,如果可能的话应该使用:

#if __cplusplus >= 201103L
reinterpret_cast<Foo*>(fooPtr)();
#else
((Foo*)fooPtr)();
#endif

如果实现支持dlsym(它是POSIX的一部分(,那么它几乎肯定支持从对象指针到函数指针类型的reinterpret_cast

相关内容

  • 没有找到相关文章

最新更新