什么时候使用reinterpret_cast? [英] When to use reinterpret_cast?

查看:173
本文介绍了什么时候使用reinterpret_cast?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对 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_casting 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?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆