Я использовал какой-то класс, у которого есть метод, требующий:
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
Это модификация, которую я сделал хорошо?
Это нормально, но для «безопасности» подумайте об использовании reinterpret_cast<const unsigned char*>(dataIn)
вместо.
Это безопаснее в том смысле, что reinterpret_cast
не может удалить const
или же volatile
в то время как бросок в стиле C может. Если вы не хотите удалять квалификаторы, то было бы неплохо, чтобы код не компилировался, если вы ошиблись.
Конечно, в этом случае мало шансов ошибиться — пункт назначения const
и вы, вероятно, заметите, если источник volatile
-qualified. Но все же полезно привыкнуть к тому, чтобы компилятор помог вам, плюс некоторые люди посчитают, что код легче читать.
Если это вообще возможно, добавьте перегрузку для простого 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);
}
};
Я также хотел бы отметить, что на первый взгляд crc32::CRC
выглядит подозрительно для меня. Похоже, что может иметь смысл записать это как перегрузку operator()
вместо.