Предположим, что у меня есть структура, я использую для моделирования различных форматов пакетов:SizeOf анонимным вложенная структура
#define MaxPacket 20
typedef struct {
u8 packetLength;
union {
u8 bytes[MaxPacket];
struct {
u16 field1;
u16 field2;
u16 field3;
} format1;
struct {
double value1;
double value2;
} format2;
};
} Packet;
я могу ожидать, что sizeof(Packet)
будет 21
. Но есть ли способ сделать что-то вроде:
sizeof(Packet.format2)
? Я пробовал это, но компилятор не доволен. Очевидно, я мог бы вытащить format1
как отдельный typedef, а затем я мог бы sizeof(format1)
. Но мне любопытно, нужно ли мне все это пройти. Мне нравится иерархический состав форматов. Это с gcc на 8-битном процессоре.
Мне также интересно, есть ли способ использовать вложенный тип. Если я должен сделать много
aPacketPointer->format2.value1; // not so onerous, but if the nesting gets deeper...
Тогда иногда неплохо было бы сделать:
Packet.format2 *formatPtr = &aPacketPointer->format2;
formatPtr->value2; // etc
Опять же, рефакторинг в кучу предшествующего определений типов бы решить эту проблему, но тогда я теряю хороший эффект смены имен вложенных точечных ссылок.
Возможно, вам будет нужно, чтобы 'sizeof (Packet)' был равен 21, но по крайней мере в двух конфигурациях компилятора, которые я пробовал на нем, это получается до 32. Возможно, это не будет проблемой для вашего использования, поскольку, по крайней мере, он больше, чем вы ожидаете (с другой стороны, может быть, это проблема). Что-то еще, что может вас удивить, состоит в том, что смещение 'union', содержащего' bytes', 'format' и' format2', составляло 8 - компиляторы помещали прокладку между полем 'packetLength' и объединением. Вы должны быть очень осторожны при моделировании проводных объектов данных в структуре C/C++. –
Имейте в виду, что @MichaelBurr, вероятно, тестировал 32-битную архитектуру, где по умолчанию все заполняется. 8b компиляторы процессора не заполняют. Ничего, что я видел в любом случае. – Larry
Да. Кастинг байтов как структур для более проводных протоколов начинается с основного предположения, что вы можете принудительно и доверять макетам структуры. У разных компиляторов обычно есть разные механизмы для этого. –