Лично я не догоняю смысл одновременного использования #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 тому назад писал программу - могу где то соврать, но суть такова).