C++ 使用哪种铸件;静态还是重新解释? inti=1000; void*p=&i; int*x=静态(p); int*y=重新解释铸件(p);
从C++ 使用哪种铸件;静态还是重新解释? inti=1000; void*p=&i; int*x=静态(p); int*y=重新解释铸件(p);,c++,casting,C++,Casting,从void*转换为int*应该使用哪种类型的强制转换?为什么?从问题的语义来看,我会选择reinterpret,因为这是您实际要做的。静态强制转换前提是您知道(通过程序设计)指向的东西确实是int 静态_cast旨在反转任何隐式转换。您隐式地转换为void*,因此,如果您知道您实际上只是在反转先前的转换,那么您可以(并且应该)使用static\u cast将其转换回 在这种假设下,没有任何东西被重新解释-void是一种不完整的类型,这意味着它没有值,因此在任何时候都不能将存储的int值解释为“v
void*
转换为int*
应该使用哪种类型的强制转换?为什么?从问题的语义来看,我会选择reinterpret,因为这是您实际要做的。静态强制转换
前提是您知道(通过程序设计)指向的东西确实是int
静态_cast旨在反转任何隐式转换。您隐式地转换为void*
,因此,如果您知道您实际上只是在反转先前的转换,那么您可以(并且应该)使用static\u cast
将其转换回
在这种假设下,没有任何东西被重新解释-void
是一种不完整的类型,这意味着它没有值,因此在任何时候都不能将存储的int值解释为“void”或将存储的“void值”解释为int。void*
只是一种丑陋的说法,“我不知道类型,但我将把指针传递给其他知道类型的人”
reinterpret\u cast
如果您忽略了一些细节,这些细节意味着您实际上可能正在使用编写时使用的类型以外的其他类型读取内存,请注意您的代码的可移植性有限
顺便说一下,用C++的方式使用<代码>空隙*/COD>指针没有太多的充分理由。C样式回调接口通常可以用模板函数(对于类似于标准函数的代码> qSque<代码>)或虚拟接口(对于任何类似于注册的侦听器的任何东西)来替换。如果C++代码使用了一些C API,那么当然你没有太多的选择。在当前C++中,,你不能使用代码中的<代码> RealTytCase<代码>。对于一个代码>空* */COD>到
int *>代码>,你只能使用<代码> StasyType Case< /Code >(或等效的C风格的Code)。
对于不同函数类型指针之间或不同对象类型指针之间的转换,您需要使用reinterpret\u cast
在C++0x中,将强制转换(p)
重新解释为静态强制转换(p)
。它可能被合并到下一个WPs中
这是一种误解,重新解释了cast(p)
将解释p
的位,就像它们代表T*
一样。在这种情况下,它将使用p
的类型读取p
的值,然后将该值转换为T*
。一个实际的类型双关语,使用类型T*的表示直接读取p
的位e> 仅在强制转换为引用类型时发生,如在重新解释强制转换(p)
中
据我所知,所有当前的编译器都允许从void*
重新解释\u cast
,并表现出与相应的静态\u cast
相当的行为,即使在当前的C++03中不允许这样做。被拒绝的代码数量将毫无乐趣,因此他们没有动机禁止它。给出了some好的细节。你可能应该看看这篇文章:如果你已经看过了。两者都没有。你不应该使用一个void*
作为开始。可能重复的我不同意,因为在这个简单的例子中,很明显,void*p实际上指向一个整数,只需要一个静态转换。重新解释转换的风险更大,因为如果有人篡改了分配void*p的代码,那么将来可能会出现一些非常奇怪的行为。@Paul:当然,如果有人篡改了分配给p
的代码,那么静态\u cast
也会出现同样的奇怪行为,例如,从指针分配到小于int
的东西。我认为使用static\u cast
用于传达转换的意图(即不应重新解释)但是,实际上,它不能阻止重新解释发生的事情,因为代码>虚空*/COD>可以转换为任何对象指针类型。@史提夫,我明白了,谢谢你的澄清。我对这类东西的理解有些模糊,因为我时不时地写C++,但是基本的注释是:恰当。在我的情况下,我会使用static\u cast。您的声明的含义是,如果您不知道类型是int或正确对齐的,您应该使用reinterpret\u cast?@Martin:这是一个问题还是一个声明?其含义是,如果您正在重新解释,您应该使用reinterpret\u cast
,因此将是im特定于实现。在某些实现中,int
的对齐要求为1,因此不会出现此问题。在另一个可能错误对齐指针的实现中,相同的代码将超出其“有限的可移植性”。在另一个实现中,您根本无法键入pun(使用char除外)因为严格的混叠规则。-1在“当前C++中,你不能使用类似于该代码的RealTytReCasePasic”。允许使用,但你可能要写的是,这个效果不是由标准保证的。它不是直接保证的,它是“未指定的”。“。但是,对于static_cast
和reinterpret_cast
conversion T*->void*->T*,保证生成原始值。由于这必须适用于每个指针值,为了阻止它,一个不正常的编译器必须记录一些系统性的不必要的更改,比如当从void*重新解释cast
时添加1,反之亦然。没有人会买它。@Alf演员是不允许的。5.2.10/1说“下面列出了可以使用reinterpret_cast显式执行的转换。不能使用reinterpret_cast显式执行其他转换。”。没有列出允许void*
->T*
或T*
->void*
的转换@Johannes:首先,只有T
int i = 1000;
void *p = &i;
int *x = static_cast<int*>(p);
int *y = reinterpret_cast<int*>(p);