有没有一种很好的方法可以将unsigned char*转换为char*?

ere*_*eOn 1 c++ casting reinterpret-cast

那些日子我一直在阅读很多reinterpret_cast<>关于应该如何使用它(并且在大多数情况下避免使用它).

虽然我知道,使用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 ?
Run Code Online (Sandbox Code Playgroud)

如果我希望我的代码具有高度可移植性,那么我似乎别无选择,只能先复制数据.就像是:

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);
Run Code Online (Sandbox Code Playgroud)

当然,这是非常不理想的,我甚至不确定它比第一个解决方案更便携.

所以问题是,在这种情况下你会做一个具有高度可移植性的代码?

Che*_*Alf 6

便携式是一种实践问题.因此,reinterpret_cast对于转换之间的特定用途char*unsigned char*便携性.但是我仍然将这种用法包装在一对函数中,而不是reinterpret_cast直接在每个地方进行.

当使用几乎所有瑕疵(包括有限保证的瑕疵reinterpret_cast)支持效率的语言时,不要过分介绍低效率.

在坚持这封信的同时,这将违背语言的精神.

干杯和hth.