will break strict-aliasing rules [-Wstrict-aliasing]
а чего, как бы это по-красивше сделать чтобы он не ругался? union не хочется в этом месте
При чем тут юнион и что ты хочешь сделать?
хочу чтоб не ругался)
Отключить предупреждение)
да я чет с gcc почти в первый раз работаю
Я правильно понимаю, что ты хочешь в aa 16 бит поместить 2 байта из буф?
Стоп. Чего вы хотите достичь? Вы отдаете себе отчет в том, что в aaa окажется buf[21]:buf[20]? Эта запись эквивалентна следующей (в предположении, что архитектура предполагает little-endian): aaa = ((uint16_t)buf[20]) | (((uint16_t)buf[21])<<8);
да, именно это и задумано. little-endian везде да
У вас UB. Так делать нельзя.
да можно)
Это не по стандарту. За такое надо по рукам давать. Используйте сдвиги.
А почему UB? Все нормально, но экстравагантно.
Если хотите в компилтайме - то вам в плюсы (constexpr/constint) или раст (макросы).
Возможно impl-defined, а не уб (в плюсах - точно уб до с++20). Но не стандартизированное поведение - точно.
Чего там нестандартизовано-то? Обычные разыменования с конверсией типов.
хочу по-старинке)
Нарушением strict aliasing.
И, возможно, проблемами с выравниванием. Если память аллоцирована с одним, а читается/пишется с другим, то тоже будет UB.
поутру переделал на сдвиги. спасибо всем кто принял участие - вообще да, так проблем в будущем меньше будет.
Вот и славненько :)
Обсуждают сегодня