reinterpret_cast 在 char* 指针上
Posted
技术标签:
【中文标题】reinterpret_cast 在 char* 指针上【英文标题】:reinterpret_cast on a char* pointer 【发布时间】:2018-05-07 14:52:57 【问题描述】:我不得不更改函数getData()
的原型,这基本上是一个遗留源代码。在将其从返回char*
更改为如下所示时,由于static_cast
,我开始出现编译错误。我的问题是,使用reinterpret_cast
是否安全,而不是static_cast
?
class C1
public:
//void *getData() return data; //Legacy implementation*
char *getData() return data; //My new implementation
private:
char data[100];
;
int main()
C1 myobj;
unsigned char* begin;
begin=static_cast<unsigned char*>(myobj.getData()); *//<== This gives compile error.use reinterpret_cast ?*
return 0;
有比 reinterpret_cast 更好的解决方案吗?
【问题讨论】:
为什么begin
不是char*
?
错误信息是什么?
嗯,这就是他们现在拥有的方式......他们还将其转换为 char * 甚至其他不同的类型,如结构等。
***.com/questions/10151834/…的可能重复
@deep_rugs 如果getData()
应该返回一些无类型的缓冲区,调用者确定它的解释方式,我认为您将getData()
更改为返回char *
是错误的,应该将其改回返回void *
。
【参考方案1】:
您可以将static_cast
从void *
转换为任何指针类型,或者在一个从另一个继承的意义上指向相关类型的指针之间。
reinterpret_cast
旨在用于指向不相关类型的指针之间。 Is 相当于从第一种类型到 void *
的 static_cast
后跟从 void *
到第二种类型的 static_cast
。 It T 和 U 是不相关的类型:
U *u = ...;
T *t;
t = reinterpret_cast<T *>(u); /* strictly the same as would be
t = static_cast<T *>(static_cast<void *>(u)); */
【讨论】:
如果你有int i
,那么reintrepret_cast<char*>(&i)
。 C++ 标准是否保证生成的地址与reintrepret_cast<void*>(&i)
相同??【参考方案2】:
这取决于你想要完成什么。如果您只想使用data
的按位表示,每个元素都被解释为unsigned char
,那么reinterpret_cast
是最好的选择。
你的问题没有给我们足够的细节来确定你的情况是否“安全”。
【讨论】:
以上是关于reinterpret_cast 在 char* 指针上的主要内容,如果未能解决你的问题,请参考以下文章
如何在java中进行reinterpret_cast以获取像素数组[重复]