#### 6.62.10 Structure-Layout Pragmas

For compatibility with Microsoft Windows compilers, GCC supports a set of `#pragma` directives that change the maximum alignment of members of structures (other than zero-width bit-fields), unions, and classes subsequently defined. The n value below always is required to be a small power of two and specifies the new alignment in bytes.

1. `#pragma pack(n)` simply sets the new alignment.
2. `#pragma pack()` sets the alignment to the one that was in effect when compilation started (see also command-line option `-fpack-struct[=n]` see Code Gen Options).
3. `#pragma pack(push[,n])` pushes the current alignment setting on an internal stack and then optionally sets the new alignment.
4. `#pragma pack(pop)` restores the alignment setting to the one saved at the top of the internal stack (and removes that stack entry). Note that `#pragma pack([n])` does not influence this internal stack; thus it is possible to have `#pragma pack(push)` followed by multiple `#pragma pack(n)` instances and finalized by a single `#pragma pack(pop)`.

Some targets, e.g. x86 and PowerPC, support the `#pragma ms_struct` directive which lays out structures and unions subsequently defined as the documented `__attribute__ ((ms_struct))`.

1. `#pragma ms_struct on` turns on the Microsoft layout.
2. `#pragma ms_struct off` turns off the Microsoft layout.
3. `#pragma ms_struct reset` goes back to the default layout.

Most targets also support the `#pragma scalar_storage_order` directive which lays out structures and unions subsequently defined as the documented `__attribute__ ((scalar_storage_order))`.

1. `#pragma scalar_storage_order big-endian` sets the storage order of the scalar fields to big-endian.
2. `#pragma scalar_storage_order little-endian` sets the storage order of the scalar fields to little-endian.
3. `#pragma scalar_storage_order default` goes back to the endianness that was in effect when compilation started (see also command-line option `-fsso-struct=endianness` see C Dialect Options).