В настоящее время я работаю над проектом, в котором мне предоставлено следующее
structre. Моя работа на C ++, но в проекте используются как C, так и C ++. Та же структура
определение используется как C, так и C ++.
typedef struct PacketHeader {
//Byte 0
uint8_t bRes :4;
uint8_t bEmpty :1;
uint8_t bWait :1;
uint8_t bErr :1;
uint8_t bEnable :1;
//Byte 1
uint8_t bInst :4;
uint8_t bCount :3;
uint8_t bRres :1;
//Bytes 2, 3
union {
uint16_t wId; /* Needed for Endian swapping */
struct{
uint16_t wMake :4;
uint16_t wMod :12;
};
};
} PacketHeader;
В зависимости от того, как используются экземпляры структуры, необходим
структура может быть большой или мало порядковый. Как первые два байта
структура каждого отдельного байта, они не нуждаются в изменении, когда порядковый номер
изменения.
Байты 2 и 3, хранящиеся как один uint16_t
, являются единственными байтами, которые нам нужны
поменяйте местами, чтобы получить желаемый порядок байтов. Чтобы получить обмен по порядку байтов, у нас есть
выполнял следующее:
//Returns a constructed instance of PacketHeader with relevant fields set and the provided counter value
PacketHeader myHeader = mmt::BuildPacketHeader(count);
uint16_t packetIdFlipped;
//Swap positions of byte 2 and 3
packetIdFlipped = myHeader.wId << 8;
packetIdFlipped |= (uint16_t)myHeader.wId >> 8;
myHeader.wId = packetIdFlipped;
Функция BuildPacketHeader(uint8_t)
присваивает значения членам wMake
и
wMod
явно, не не пишет в элемент wId
. Мой вопрос касается
безопасность чтения из члена wId
внутри возвращенного экземпляра
структура.
Такие вопросы, как
Доступ к неактивному члену объединения и неопределенному поведению? ,
Назначение союзов в C и C ++ ,
и Раздел 10.4 проекта стандарта. У меня есть , в каждом из которых упоминается неопределенное поведение, возникающее в результате доступа к неактивному члену объединения в C ++.
Пункт 1 в разделе 10.4 связанного проекта также содержит следующее примечание, хотя я не уверен, что понимаю всю используемую терминологию:
[Примечание. Для упрощения использования объединений предоставляется одна специальная гарантия: если объединение стандартных макетов содержит несколько структур стандартных макетов, которые имеют общую начальную последовательность (10.3), и если нестатический датаблок объект этого типа объединения стандартной компоновки является активным и является одной из структур стандартной компоновки, ему разрешено проверять общую начальную последовательность любого из элементов структуры стандартной компоновки; см. 10.3.— конец примечания]
Читает ли myHeader.wId
в строке packetIdFlipped = myHeader.wId << 8
неопределенное поведение?
Является ли неназванная структура активным членом, так как он был последним членом, записанным в вызове функции?
Или примечание означает, что доступ к члену wId
безопасен, так как он и структура имеют общий тип? (и означает ли это общая начальная последовательность ?)
Заранее спасибо