Я много читал в те дни около reinterpret_cast<>
и как он должен использовать его (и избегать его в большинстве случаев).Есть ли хороший способ конвертировать из unsigned char * в char *?
Хотя я понимаю, что с помощью reinterpret_cast<>
к отлит из, скажем, unsigned char*
к char*
является реализация определяется (и, таким образом, непереносимой), кажется, нет другого способа эффективно преобразовать один в другой.
Допустим, я использую библиотеку, которая имеет дело с unsigned char*
, для обработки некоторых вычислений. Internaly, я уже использую char*
для хранения моих данных (и я не могу его изменить, потому что он убьет щенков, если я это сделаю).
я сделал бы что-то вроде:
char* mydata = getMyDataSomewhere();
size_t mydatalen = getMyDataLength();
// We use it here
// processData() takes a unsigned char*
void processData(reinterpret_cast<unsigned char*>(mydata), mydatalen);
// I could have done this:
void processData((unsigned char*)mydata, mydatalen);
// But it would have resulted in a similar call I guess ?
Если я хочу, чтобы мой код был очень портативным, кажется, у меня нет другого выбора, кроме как копировать мои данные первыми. Что-то вроде:
char* mydata = getMyDataSomewhere();
size_t mydatalen = getMyDataLength();
unsigned char* mydata_copy = new unsigned char[mydatalen];
for (size_t i = 0; i < mydatalen; ++i)
mydata_copy[i] = static_cast<unsigned char>(mydata[i]);
void processData(mydata_copy, mydatalen);
Конечно, это весьма неоптимальным, и я даже не уверен, что это более компактен, чем первое решение.
Итак, вопрос в том, что бы вы сделали в этой ситуации, чтобы иметь очень портативный код?
Непросто использовать naked char * в программе на C++ для чего угодно, кроме того, что конкретный листинг (между unsigned char *, char * и/или подписанный char *) сам по себе очень портативен. –