Предположим, что два микропроцессора обмениваются по шине данных некоторыми пакетами. Пакет состоит из заголовка и некой полезной нагрузки. Заголовок имеет вид:
Код: Выделить всё
struct header_t{
uint8_t type;
uint16_t seq;
};
У нас есть некий буфер, в который мы принимаем данные:
После того, как данные были приняты, выделяем заголовок:
И вот теперь начинается самое интересное. При выравнивании по границе 1 байт sizeof(hdr.type) вернет 1. То есть значение type будет лежать в rxbuf[0];
А при выравнивании по границе 2 байт sizeof(hdr.type) вернет 2. То есть значение type будет лежать в rxbuf[0] и rxbuf[1]; Соответственно заголовок займет не три байта а четыре и структура пакета будет нарушена.
#pragma pack в данном случае позволяет задать границу выравнивания. Выглядит примерно так:
Код: Выделить всё
#pragma pack(push,1)
struct header_t{
uint8_t type;
uint16_t seq;
};
#pragma pack(pop)