哪个演员使用; static_cast还是reinterpret_cast?

时间:2010-12-18 01:53:31

标签: c++ casting

int i = 1000;
void *p = &i;

int *x = static_cast<int*>(p);
int *y = reinterpret_cast<int*>(p);

应该使用哪个广告代码从void*转换为int*以及为什么?

4 个答案:

答案 0 :(得分:13)

static_cast前提是您(通过设计程序)知道指向的内容确实是int

static_cast旨在反转任何隐式转换。您已隐式转换为void*,因此您可以(并且应该)使用static_cast 转换回来,如果您知道您确实只是在撤消之前的转换。

有了这个假设,没有任何东西被重新解释 - void是一个不完整的类型,意味着它没有值,所以在任何时候你都不会将存储的int值解释为“void”或存储的“void”值“为int。 void*只是一种丑陋的说法,“我不知道这种类型,但我会将指针传递给其他人。”

reinterpret_cast如果您遗漏了一些细节,这些细节意味着您实际上可能正在使用类型以外的类型读取内存,并且请注意您的代码将具有有限的可移植性。

顺便说一下,在C ++中以这种方式使用void*指针的原因并不是很多。 C样式的回调接口通常可以替换为模板函数(对于任何类似于标准函数qsort的东西)或虚拟接口(对于任何类似于已注册侦听器的东西)。如果您的C ++代码使用的是某些C API,那么您当然没有太多选择。

答案 1 :(得分:1)

在当前的C ++中,您不能在该代码中使用reinterpret_cast。对于void*int*的转换,您只能使用static_cast(或等效的C风格转换)。

对于不同函数类型指针之间或不同对象类型指针之间的转换,您需要使用reinterpret_cast

在C ++ 0x中,reinterpret_cast<int*>(p) will be equivalentstatic_cast<int*>(p)。它可能包含在下一个WP之一中。

这是一种误解,reinterpret_cast<T*>(p)会解释p的位,就像它们代表T*一样。在这种情况下,它将使用p的类型读取p的值,然后将该值转换为T*。使用类型p的表示直接读取T*的位的实际 type-pun 仅在转换为引用类型时发生,如reinterpret_cast<T*&>(p)中所示。

据我所知,所有当前的编译器都允许来自reinterpret_cast的{​​{1}}并且行为等同于相应的void*,即使当前C +中不允许这样做+03。被拒绝时代码被破坏的数量将无济于事,因此他们没有动力禁止它。

答案 2 :(得分:0)

答案 3 :(得分:-1)

从问题的语义来看,我会重新解释,因为这就是你实际做的事情。