问题描述
我对 reinterpret_cast
vs static_cast
的适用性感到困惑。从我已经阅读的一般规则是使用静态转型,当类型可以在编译时解释,因此单词 static
。这是C ++编译器在内部用于隐式转换的转换。
reinterpret_cast
适用于两种情况,将整数类型转换为指针类型,反之亦然,或将一种指针类型转换为另一种类型。我得到的一般想法是这是不便宜,应该避免。
我有点困惑是我需要的一个用法,我从C调用C ++,C代码需要坚持到C ++对象基本上它拥有一个 void *
。应该使用什么转换在 void *
和类类型之间进行转换?
我已经看到了 static_cast
和 reinterpret_cast
的使用情况?虽然从我一直在读,看起来 static
是更好的转型可以发生在编译时间?虽然它说要使用 reinterpret_cast
将一种指针类型转换为另一种指针类型?
I am little confused with the applicability of reinterpret_cast
vs static_cast
. From what I have read the general rules are to use static cast when the types can be interpreted at compile time hence the word static
. This is the cast the C++ compiler uses internally for implicit casts also.
reinterpret_cast
are applicable in two scenarios, convert integer types to pointer types and vice versa or to convert one pointer type to another. The general idea I get is this is unportable and should be avoided.
Where I am a little confused is one usage which I need, I am calling C++ from C and the C code needs to hold on to the C++ object so basically it holds a void*
. What cast should be used to convert between the void *
and the Class type?
I have seen usage of both static_cast
and reinterpret_cast
? Though from what I have been reading it appears static
is better as the cast can happen at compile time? Though it says to use reinterpret_cast
to convert from one pointer type to another?
推荐答案
C ++标准保证以下内容:
The C++ standard guarantees the following:
static_cast
指向和从 void *
保存地址。也就是说,在下面,a,b和c都指向同一个地址:
static_cast
ing a pointer to and from void*
preserves the address. That is, in the following, a, b and c all point to the same address:
int* a = new int();
void* b = static_cast<void*>(a);
int* c = static_cast<int*>(b);
reinterpret_cast
指向不同类型的,然后 reinterpret_cast
将其恢复为原始类型,您将获得原始值。所以在下面:
reinterpret_cast
only guarantees that if you cast a pointer to a different type, and then reinterpret_cast
it back to the original type, you get the original value. So in the following:
int* a = new int();
void* b = reinterpret_cast<void*>(a);
int* c = reinterpret_cast<int*>(b);
a和c包含相同的值,但b的值未指定。 (实际上它通常包含与a和c相同的地址,但在标准中没有指定,并且在具有更复杂的内存系统的机器上可能不是真的)
a and c contain the same value, but the value of b is unspecified. (in practice it will typically contain the same address as a and c, but that's not specified in the standard, and it may not be true on machines with more complex memory systems.)
对于向和从void *的转换,应该优先使用 static_cast
。
For casting to and from void*, static_cast
should be preferred.
这篇关于什么时候使用reinterpret_cast?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!