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_castvoid * 转换为任何指针类型,或者在一个从另一个继承的意义上指向相关类型的指针之间。

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&lt;char*&gt;(&amp;i)。 C++ 标准是否保证生成的地址与reintrepret_cast&lt;void*&gt;(&amp;i) 相同??【参考方案2】:

这取决于你想要完成什么。如果您只想使用data 的按位表示,每个元素都被解释为unsigned char,那么reinterpret_cast 是最好的选择。

你的问题没有给我们足够的细节来确定你的情况是否“安全”。

【讨论】:

以上是关于reinterpret_cast 在 char* 指针上的主要内容,如果未能解决你的问题,请参考以下文章

如何在java中进行reinterpret_cast以获取像素数组[重复]

使用 constexpr 函数替代 reinterpret_cast

cpp test

cpp test

cpp test

cpp test