Разрешено ли приводить char [] к unsigned char *?

Я использовал какой-то класс, у которого есть метод, требующий:

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

Это модификация, которую я сделал хорошо?

3

Решение

Это нормально, но для «безопасности» подумайте об использовании reinterpret_cast<const unsigned char*>(dataIn) вместо.

Это безопаснее в том смысле, что reinterpret_cast не может удалить const или же volatileв то время как бросок в стиле C может. Если вы не хотите удалять квалификаторы, то было бы неплохо, чтобы код не компилировался, если вы ошиблись.

Конечно, в этом случае мало шансов ошибиться — пункт назначения constи вы, вероятно, заметите, если источник volatile-qualified. Но все же полезно привыкнуть к тому, чтобы компилятор помог вам, плюс некоторые люди посчитают, что код легче читать.

7

Другие решения

Если это вообще возможно, добавьте перегрузку для простого 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() вместо.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector