Oracle® Solaris Studio 12.4:C 用户指南

退出打印视图

更新时间: 2014 年 12 月
 
 

2.11.19 pack

#pragma pack(n)

使用 #pragma pack(n) 将影响结构或联合的成员封装。缺省情况下,结构或联合的成员在其自然边界对齐;对于 char 类型为一个字节,对于 short 类型为两个字节,对于 integer 类型为四个字节,依此类推。如果存在 n,则它必须是 2 的幂,为任何结构或联合成员指定最严格的自然对齐。不接受零。

#pragma pack(n) 指令应用于它后面的所有结构或联合定义,直到出现下一个 pack 指令。如果在具有不同包装的不同转换单元中定义了相同的结构或联合,那么程序会因某种原因而失败。特别是,不应在包含定义了预编译库的接口的头文件之前使用 #pragma pack(n)。#pragma pack(n) 的建议用法是,将它放在程序代码中紧挨在要封装的任何结构或联合的前面。在封装的结构后面紧跟 #pragma pack( )。

您可以使用 #pragma pack(n) 为结构或联合成员指定对齐边界。例如,#pragma pack(2) 会使 int、long、long long、float、double、long double 和指针与双字节边界对齐,而不是与其自然边界对齐。

如果 n 等于或大于您使用的平台上最严格的对齐(在 x86 上使用 -m32 时为 4,在 SPARC 上使用 -m32 时为 8,但使用 -m64 时为 16),则指令具有自然对齐的效果。同样,如果省略 n,成员对齐将恢复为自然对齐边界。

请注意,使用 #pragma pack 时,封装的结构或联合本身的对齐方式与其更严格对齐的成员相同。因此,该 structunion 的任何声明将使用 pack 对齐。例如,只包含 char 数据的 struct 无对齐限制,而包含 double 数据的 struct 将按 8 字节边界对齐。


注 -  如果您使用 #pragma pack 将结构或联合成员与其自然边界以外的边界对齐,则访问这些字段通常会导致 SPARC 出现总线错误。要避免发生此错误,请确保同时还指定了 -xmemalign 选项。有关编译此类程序的最佳方法,请参见-xmemalign=ab