整个结构上是否允许使用 GCC 属性(打包)?

ddb*_*bug 0 c gcc language-lawyer

从一开始我就相信 __attribute__((packed)) 可以放在结构体或 typedef 上,如下所示:

typedef struct __attribute__((packed)) {
    uint8_t   m1;
    uint16_t  m2;
    uint8_t   m3;
    uint32_t  m4;
    uint8_t   m5;
} junk;

Run Code Online (Sandbox Code Playgroud)

但后来有人指出,最近的 gcc 手册中没有记录这种明显的用法,因为已经有几个版本了。相反,它说(在v.12中):“[packed] 属性不适用于非成员对象。”
整个结构不是成员对象,对吗?
那么上面的例子合法吗,还是依赖于UB(稍后可以咬)?

小智 5

上面的例子是合法的。您链接到的文档是变量属性的列表,它们附加到单个变量,而不是整个结构。当文档说该属性“不适用于非成员对象”时,就是说它不适用于非成员变量。该页面上的任何内容均不适用于此处显示的属性的使用packed

相反,您使用packed属性的示例是使用类型属性,它恰好与变量属性具有相同的名称packed;请参阅此处的文档。packed是那里列出的属性之一;除了名称和有些相关的功能(控制字段在结构中的排列方式)之外,这两个属性彼此不相关。