В моем проекте у нас есть такой код:
// raw data consists of 4 ints
unsigned char data[16];
int i1, i2, i3, i4;
i1 = *((int*)data);
i2 = *((int*)(data + 4));
i3 = *((int*)(data + 8));
i4 = *((int*)(data + 12));
Я говорил с моим техническим руководителем, что этот код может быть не переносимым, поскольку он пытается отличить unsigned char*
от int*
, который обычно имеет более строгие требования к выравниванию. Но технический руководитель говорит, что все в порядке, большинство компиляторов остается тем же самым значением указателя после кастинга, и я могу просто написать такой код.
Чтобы быть откровенным, я не уверен. После исследования я нахожу некоторых людей против использования отливок, таких как выше, например здесь и здесь.
Итак, вот мои вопросы:
- Действительно ли безопасно разыменовывать указатель после кастинга в реальном проекте?
- Есть ли разница между C-style casting и
reinterpret_cast
? - Есть ли разница между C и С++?