我想将函数指针重新解释为 void* 变量。函数指针的类型将是Class* (*)(void*)
.
下面是示例代码,
class Test
{
int a;
};
int main()
{
Test* *p(void **a);
void *f=reinterpret_cast<void*>(p);
}
上面的代码适用于 Visual Studio/x86 编译器。但使用ARM编译器时,会出现编译错误。不知道为什么。
错误:#694:reinterpret_cast 不能
抛弃 const 或其他类型
预选赛
我读了解释将函数指针转换为另一种类型
我对下面的解释感到担心。
函数指针和之间的转换
常规指针(例如,强制转换void
(*)(void)
to a void*
)。功能
指针不一定相同
大小与常规指针一样,从那时起
它们可能包含一些架构
额外的上下文信息。这
在 x86 上可能可以正常工作,但是
请记住,这是未定义的行为。
如何进行此类转换void (*)(void*) -> void*
有效,至少它在大多数编译器中编译得几乎相同?
reinterpret_cast
不能用于将函数指针强制转换为void*
。虽然 C 类型转换还可以执行一些静态、重新解释和 const 类型转换的组合所不允许的其他操作,但该转换并不是其中之一。
在 C 中,允许强制转换,但未定义其行为(即,即使往返也不能保证有效)。
一些 POSIX 函数需要转换才能发挥作用。
我在这里使用过几个编译器:
- 即使在最高一致性模式下,也不会阻止 C 转换。有些根据警告和一致性级别发出警告,而另一些则无论我尝试什么都没有发出警告。
- 即使在更宽松的级别,reinterpret_cast 对某些编译器来说也是一个错误,而其他编译器在所有情况下都接受它而没有发出警告。
在 C++0X 的最新可用草案中,reinterpret_cast
有条件地支持函数指针和对象指针之间的转换。
请注意,这是否有意义将更多地取决于目标而不是编译器:像 gcc 这样的可移植编译器将具有由目标体系结构和可能的 ABI 强加的行为。
正如其他人所说,
Test* *p(void **a);
定义一个函数,而不是指向函数的指针。但是函数到函数指针的隐式转换是针对reinterpret_cast的参数进行的,所以reinterpret_cast得到的是Test** (*p)(void** a)
.
感谢 Richard,它让我更深入地重新审视这个问题(郑重声明,我错误地认为函数指针到对象指针是 C 类型转换允许未经 C++ 类型转换组合授权的内容的一种情况)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)