其他人指出你不能这样做(强烈地说,也不允许void*
使用任何东西进行强制转换 - 但编译器会默默地容忍。打算在这里使用)。reinterpret_cast
static_cast
我通常执行以下操作,这是一个双关语,并且是推荐的方法,根据手册页dlopen
(这是关于做相反的 - 转换为函数 指针)。获取函数指针的地址会给你一个数据指针:指向函数指针的指针。这将允许您将其转换为. 它假装它指向一个(而不是函数指针),然后读取它。void*
void*
void*
Test* (*pF)(void **a);
void *p = *(void**)(void*)&pF;
中间转换 tovoid*
使其等同于static_cast
在内部使用 two ,并使 GCC 对类型双关语的警告保持沉默。使用 C++ 样式转换,这看起来像是两个static_cast
's的组合
void *p = *static_cast<void**>(static_cast<void*>(&pF));
我发现使用这种技术,当左右类型的大小不同时,GCC 会自动注意到,并在这种情况下发出警告。不用说,就像所有试图解决此限制的技术一样,这是未定义的行为。
如果您有一个函数,并且想要void*
指向它,您可以在一行中完成所有操作,但这在语法上有点麻烦。这里是如何做到这一点的,但如果你有阅读问题,我不推荐它 - 但是你可以在宏中使用它
// using the function declaration you provided
Test** pF(void **a);
void *p = *(void**)(void *) &(Test** (* const&)(void **a))&pF;
开始能够执行类型的技巧是将临时函数指针转换为对 const 的左值引用,您可以获取其地址,然后像上面一样继续。
使用显式 C++ 样式static_cast
转换,这看起来要复杂得多,因为您必须考虑 constness。C 风格的演员自动处理了这个问题。玩得开心!
int main() {
Test** pF(void **a);
void *p = *static_cast<void* const*>(
static_cast<void const*>(
&static_cast<Test** (* const&)(void **a)>(&pF)));
}