Я пишу код, который использует функцию fstream read(), и эта функция ожидает char* в качестве буфера. Позже я хочу работать с байтами в этом буфере как беззнаковые символы, поэтому мне либо придется: 1. объявить буфер как char*, а затем выполнить static_casts для каждого элемента позже, 2. объявить буфер как unsigned char*, а затем выполнить reinterpret_cast, когда я передаю его функции чтения, или 3. объявить буфер как char*, а также создать приведенный указатель, который я использую для доступа к буферу как unsigned char.
Вот фрагмент:
char* buf = new char[512];
unsigned char* ubuf = reinterpret_cast<unsigned char*>(buf);
fstream myfile;
myfile.open("foo.img");
myfile.seekg(446);
myfile.read(buf, 16);
//myfile.read(reinterpret_cast<char*>(buf), 16);
int bytes_per_sector = ubuf[1] << 8 | ubuf[0];
...
Мне нравится этот способ, потому что мне нужно выполнить приведение только один раз, и я могу просто получить доступ к буферу любого типа, не выполняя приведение каждый раз. Но, это хорошая практика? Есть ли что-нибудь, что может пойти не так здесь? Использование reinterpret_cast заставляет меня немного нервничать, потому что обычно я его не использую, и мне много раз говорили быть с ним осторожным.
reinterpret_cast
действительно безопасен и имеет смысл. - person Konrad Rudolph   schedule 01.02.2015reinterpret_cast
, потому что ни один из других не будет работать, почему бы вместо этого не сделать приведение в стиле c? Это в равной степени безопасно (или небезопасно) и может быть достаточно менее громоздким, так что один указатель (unsigned char*
илиchar*
, в зависимости от того, сколько вам нужно) не приводит к слишком большому (если вообще есть) дополнительному коду. - person Deduplicator   schedule 01.02.2015reinterpret_cast
, будучи более явным, также делает код более читабельным, поскольку он четко сообщает читателю, какое приведение выполняется. - person Konrad Rudolph   schedule 01.02.2015reinterpret_cast
является явным и, следовательно, повышает читаемость, даже если не обеспечивает безопасность типов.reinterpret_cast
имеет четко определенное значение. Актерский состав в стиле C, напротив, этого не делает. Это может означать что угодно, поэтому использование его в коде скрывает фактическую семантику от читателя. Общепризнано, что это невероятно плохая идея. - person Konrad Rudolph   schedule 01.02.2015implicit_cast
нет в C+ +14), а остальные 4 вида (статические, константные, динамические, реинтерпретируемые) сделать короткими и лаконичными. - person Deduplicator   schedule 01.02.2015