我有一个 dlsym() 返回的 void 指针,我想调用 void 指针指向的函数。所以我通过强制转换进行类型转换:
void *gptr = dlsym(some symbol..) ;
typedef void (*fptr)();
fptr my_fptr = static_cast<fptr>(gptr) ;
我也尝试过 reinterpret_cast
但没有运气,虽然 C 转换运算符似乎工作..
原文由 sud03r 发布,翻译遵循 CC BY-SA 4.0 许可协议
在 C++98⁄03 中,不允许将
void*
直接 转换为函数指针(不应使用任何类型转换进行编译)。 C++0x 有条件地支持它(实现可以选择定义行为,如果它确实定义了它,那么它必须按照标准所说的去做。Avoid*
,由C++98⁄03 标准,旨在指向对象而不是包含函数指针或成员指针。知道您正在做的事情在很大程度上依赖于实现,这是一个应该在大多数平台上编译和工作的选项(假设 32 位指针,使用
long long
用于 64 位),即使根据它显然是未定义的行为符合标准:这是另一个应该编译和工作的选项,但带有与上面相同的警告:
或者,在慢动作中…
它本质上利用了函数指针的地址是一个对象指针(
void (**object_ptr)()
)这一事实 - 所以我们可以使用reinterpret_cast
将其转换为任何其他对象指针:例如void**
。然后我们可以将地址返回(通过取消引用void**
)到实际的函数指针并将 gptr 的值存储在那里。yuk - 绝不是定义明确的代码 - 但它应该做你期望它在大多数实现中做的事情。