Лично я не догоняю смысл одновременного использования #pragma
pack(1) и __align(4) применительно к struct {} как бы по умолчанию компилятор сам выполняет выравнивание (openwatcom например выравнивает на 4, а можно задать и другое значения опциями компилятора).
Другой случай: gcc странный .
__attribute__((packed))
и
__attribute__((1))
как бы должны делать одно и тоже но по факту результат разный.
struct IH{
U16 my_id;
U8 type_sens;
U32 conag;
} __attribute__((packed)) ;
можно делать присвоение conag = 33; (работа с conag выполнялась на уровне асма побайтно),
а если __attribute__((1)) - то ни черта не работало.
ИМХО - пишу по памяти (лет 5 тому назад писал программу - могу где то соврать, но суть такова).