假设一个动态库导出一个函数,例如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
。