能否将char[]强制转换成unsigned char*?

3

我正在使用一些类,其中有一个需要特定参数的方法:

const unsigned char *sData

作为参数。 当我调用以下内容时:
char dataIn[]="The quick brown fox jumps over the lazy dog";     
obj.CRC(dataIn,strlen(dataIn),&checksum); // compute checksum

我遇到了一个错误:
Error   1   error C2664: 'void crcClass::CRC(const unsigned char *,size_t,unsigned int *)' : cannot convert parameter 1 from 'char [44]' to 'const unsigned char *' 

所以我修改了上面的代码,像这样,它就可以工作:
obj.CRC((const unsigned char*)dataIn,strlen(dataIn),&checksum); // compute checksum

我修改的内容是否正确?


1
你调用了完全不同的方法;文档上说什么? - Adrian Panasiuk
不,这是同样的方法,我在打字时犯了错误。 - user2568508
2个回答

7

这样做可以,但为了“安全性”,建议使用reinterpret_cast<const unsigned char*>(dataIn)

这样做更加安全,因为reinterpret_cast无法移除constvolatile,而C风格的强制类型转换可以。如果您不想删除限定符,则代码无法编译将有助于避免错误。

当然,在这种情况下很少出错——目的地已经是const限定的,如果源是volatile限定的,您可能会注意到。但让编译器帮助您并养成好习惯还是很有用的,而且有些人会认为这样写的代码更易读。


C++风格的转换确实更容易阅读。或者说,至少它看起来更好。 - user529758
准确地说,我喜欢C语言,但它的一个基本缺陷是强制类型转换很丑:P - user529758
C++ 中的另一个选项是 typedef const unsigned char *byteptr,然后使用 byteptr(dataIn)。有时读者并没有意识到它与 C 风格转换具有相同的语义,认为单参数构造函数调用比 C 风格转换更加高尚。 - Steve Jessop
就我个人而言,我更喜欢使用 static_cast。我认为函数式转换相当令人困惑。 - user529758
2
@Drax:这取决于您是否希望在将dataIn更改为const char数组时必须更改此行代码。将其转换为const类型对转换源的最小要求。我认为这并不一定是明显的胜利。 - Steve Jessop
显示剩余3条评论

0
如果可能的话,请为普通的char添加一个重载,并将强制转换隐藏在CRC类内部:
class crc32 {

    // ...
    unsigned int CRC(unsigned char const *in) { 
       // existing function
    }

    unsigned int CRC(char const *in) { 
       // pass through to preceding function:
       return CRC(reinterpret_cast<unsigned char const *>(in);
    }
};

我还要指出的是,乍一看让我感到怀疑。它看起来更像是应该作为的重载而不是这样写的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接