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)
当然,这是非常不理想的,我甚至不确定它比第一个解决方案更便携.
所以问题是,在这种情况下你会做一个具有高度可移植性的代码?
便携式是一种实践问题.因此,reinterpret_cast对于转换之间的特定用途char*和unsigned char*便携性.但是我仍然将这种用法包装在一对函数中,而不是reinterpret_cast直接在每个地方进行.
当使用几乎所有瑕疵(包括有限保证的瑕疵reinterpret_cast)支持效率的语言时,不要过分介绍低效率.
在坚持这封信的同时,这将违背语言的精神.
干杯和hth.