我正在编写一些使用fstream read()函数的代码,该函数期望一个char*作为缓冲区。稍后,我希望使用该缓冲区中的字节作为无符号字符进行操作,因此我要么:1. 声明缓冲区为char*,然后稍后对每个元素进行static_cast 2. 声明缓冲区为unsigned char*,然后在将其传递给读取函数时进行reinterpret_cast,或者3. 声明缓冲区为char*,并创建一个转换后的指针用于以unsigned char的形式访问缓冲区。
这是一个片段:
char* buf = new char[512];
unsigned char* ubuf = reinterpret_cast<unsigned char*>(buf);
fstream myfile;
myfile.open("foo.img");
myfile.seekg(446);
myfile.read(buf, 16);
//myfile.read(reinterpret_cast<char*>(buf), 16);
int bytes_per_sector = ubuf[1] << 8 | ubuf[0];
...
我喜欢这种方式,因为我只需要转换一次类型,就可以随意访问缓冲区而无需每次进行类型转换。但是,这样做是否是一个好的实践?这里有什么问题吗?使用reinterpret_cast使我有点紧张,因为我平时不怎么用它,并且被告知要小心使用它很多次。
reinterpret_cast
实际上是安全且有意义的。 - Konrad Rudolphreinterpret_cast
更加明确,使代码更易读,因为它清楚地告诉读者正在执行哪种类型转换。 - Konrad Rudolphreinterpret_cast
也是显式的,因此可以增加可读性。reinterpret_cast
具有明确定义的含义。 相比之下,C风格的转换则没有。 它可以表示许多事情,因此在代码中使用它会使实际语义对读者变得模糊。 这通常被认为是一个极其糟糕的想法。 - Konrad Rudolphimplicit_cast
不在C ++14中),并使其他4种类型(static,const,dynamic,reinterpret)成为简短而简洁的变体。 - Deduplicator