【问题标题】:reinterpret_cast on a char* pointerreinterpret_cast 在 char* 指针上
【发布时间】: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 * 甚至其他不同的类型,如结构等。
  • @deep_rugs 如果getData() 应该返回一些无类型的缓冲区,调用者确定它的解释方式,我认为您将getData() 更改为返回char * 是错误的,应该将其改回返回void *

标签: c++


【解决方案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 是最好的选择。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-24
    • 2018-04-05
    • 1970-01-01
    • 2016-12-26
    相关资源
    最近更新 更多