6.5.11 Директивы управления компоновкой структур
Для обеспечения совместимости с компиляторами Microsoft Windows GCC поддерживает набор директив #pragma pack, изменяющих максимальное выравнивание членов структур (за исключением битовых полей нулевой ширины), объединений и классов, определяемых далее. Значение n ниже задаёт новое выравнивание в байтах и может быть равно 1, 2, 4, 8 или 16. Также допускается значение 0, указывающее, что следует использовать выравнивание по умолчанию (как если бы директива #pragma pack не действовала).
#pragma pack(n)-
Задаёт новое выравнивание в соответствии со значением n.
#pragma pack()-
Задаёт выравнивание, действовавшее на момент начала компиляции (см. также параметр командной строки -fpack-struct[=n]. См. раздел Параметры соглашений о генерации кода).
#pragma pack(push[,n])-
Помещает текущую настройку выравнивания во внутренний стек, а затем, при необходимости, задаёт новое выравнивание.
#pragma pack(pop)-
Восстанавливает настройку выравнивания, сохранённую на вершине внутреннего стека (и удаляет эту запись из стека). Обратите внимание, что
#pragma pack([n])не влияет на этот внутренний стек; поэтому можно использовать#pragma pack(push), за которым следуют несколько директив#pragma pack(n), а исходное состояние восстановить одной директивой#pragma pack(pop).
Для упаковки структуры можно также использовать атрибут типа packed (см. раздел Общие атрибуты типов). Однако атрибут packed конфликтует с #pragma pack, и их совместное использование может привести к ложным предупреждениям или неожиданному поведению.
Некоторые целевые платформы, например x86 и PowerPC, поддерживают директиву #pragma ms_struct, которая задаёт для последующих объявлений структур и объединений компоновку так же, как у __attribute__ ((ms_struct)); см. раздел Атрибуты переменных x86.
#pragma ms_struct onВключает компоновку Microsoft.
#pragma ms_struct offОтключает компоновку Microsoft.
#pragma ms_struct resetВозвращает компоновку по умолчанию.
Большинство целевых платформ также поддерживают директиву #pragma scalar_storage_order, задающую для последующих объявлений структур и объединений ту же компоновку, что и у документированного атрибута __attribute__ ((scalar_storage_order)); см. раздел Общие атрибуты типов.
#pragma scalar_storage_order big-endian#pragma scalar_storage_order little-endian-
Задают порядок байтов для скалярных полей: от старшего к младшему и от младшего к старшему соответственно.
#pragma scalar_storage_order defaultВозвращает порядок байтов, действовавший на момент начала компиляции (см. также параметр командной строки -fsso-struct=endianness; см. раздел Параметры управления диалектом C).
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/Structure_002dLayout-Pragmas.html