У меня есть куча кода, принимающего двоичные капли из сети. Зная тип капли, я до сих пор использовал каламбур (псевдо):
uint8_t* data = network.get();
if(type == "A") {
uint32_t* var = reinterpret_cast<uint32_t*>(data);
...
} else if (type == "B") {
float* var = reinterpret_cast<float*>(data);
...
}
А кое-где есть союзы:
union A {
float valf;
uint32_t valu;
};
И это, казалось бы, работает нормально, но теперь я читаю сообщения о каламбурах типов, например, это UB по стандарту, и вместо этого я должен использовать memcpy. Тем не менее, он работает на многих платформах.
В1: Есть ли способ проверить, поддерживается ли каламбур и работает ли оно должным образом на моей платформе?
Q2: Могу ли я ожидать, что основные компиляторы (MSVC, GCC) будут предупреждать или сообщать об ошибке при выборе недопустимого типа на моей платформе?
char*
, а затем использоватьmemcpy
для преобразования данных, что-то вот так. Обратите внимание, что при включенной оптимизации копирование вообще не происходит. (обновление: вы только что удалили тег C, не важно). - person Groo   schedule 16.06.2020