问题描述
我要reinter preT投一个函数指针到void *的变量。该类型的函数指针将是类型类*(*)(无效*)
。
I want to reinterpret cast a function pointer into a void* variable. The type of the function pointer will be of type Class* (*)(void*)
.
下面是示例code,
class Test
{
int a;
};
int main()
{
Test* *p(void **a);
void *f=reinterpret_cast<void*>(p);
}
以上code与Visual Studio / 86的编译器效果很好。但随着ARM编译器,它提供了编译错误。不知道为什么。
The above code works well with Visual Studio/x86 compilers. But with ARM compiler, it gives compilation error. Don't know why.
错误:#694:reinter pret_cast不能
抛弃const或其他类型的
预选赛
我读http://stackoverflow.com/questions/559581/casting-a-function-pointer-to-another-type
我担心下面的解释。
函数指针之间铸造
普通指针(例如铸造无效
到
(*)(无效)无效*
)。功能
指针不一定相同
尺寸为常规指针,因为上
它们可能包含某些架构
额外的上下文信息。这个
可能会工作在x86不错,但
请记住,这是不确定的行为。
如何从做这样的转换无效(*)(无效*) - GT;无效*
有效地使ATLEAST它在大多数编译器编译的几乎是相同的?
How to do such conversions from void (*)(void*) -> void*
effectively so that atleast it compiles almost the same in most of the compilers ?
推荐答案
reinter pret_cast
不能用于铸造函数指针到无效*
。虽然有一些额外的东西,一个C投可以做并非由静态组合允许的,reinter preT和const投射,即转换不是其中之一。
reinterpret_cast
can't be used to cast a pointer to function to a void*
. While there are a few additional things that a C cast can do which aren't allowed by combination of static, reinterpret and const casts, that conversion is not one of them.
在C语言中投是允许的,但它的行为是没有定义(即连往返不保证工作)。
In C the cast is allowed, but it's behavior isn't defined (i.e. even round trip isn't guaranteed to work).
一些POSIX的功能需要转换为有用的好
Some POSIX functions need the conversion to be well useful.
我打过几个编译器我在这里:
I've played with several compilers I've here:
- 无prevent的C投,即使在最高的一致性模式。一些给取决于预警和一致性级别警告,其他人没有给出任何警告,我试过。
- 的reinter pret_cast是,即使在较为宽松的水平有些编译一个错误,而其他接受了它在所有的情况下,而没有给予警告。
在函数指针之间进行的C ++ 0x中, reinter pret_cast
最后可用草案和对象指针有条件的支持。
In the last available draft for C++0X, the reinterpret_cast
between function pointers and objects pointers is conditionally supported.
请注意,如果该有意义与否将取决于靶比编译器更:便携式编译像gcc会已经行为由目标架构和强加于可能ABI
Note that if that make sense or not will depend on the target more than the compiler: a portable compiler like gcc will have a behavior imposed by the target architecture and possibly ABI.
至于其他有做的话,
Test* *p(void **a);
定义了一个函数,而不是一个指针运行。但功能函数指针隐式转换为以reinter pret_cast的说法做,还等什么reinter pret_cast得到的是一个测试**(* P)(无效**一)
。
感谢Richard这让我重新审视这个问题更深入(备案,我就在想,该函数指针的指针的对象误认为是所在的C铸允许一个案例中的东西没有用C授权++蒙上组合)
Thanks to Richard which makes me revisit the issue more in depth (for the record, I was mistaken in thinking that the pointer to function to pointer to object was one case where the C cast allowed something not authorized by C++ casts combinations).
这篇关于reinter pret_cast为void *与函数指针工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!