JJJ:结构体定义中常加的后缀:attribute ((packed))

__attribute__ ((packed)): 的作用就是告诉编译器取消结构体在编译过程中的优化对齐,按照实际占用字节数进行对齐,是GCC特有的语法。这个功能是跟操作系统没关系,跟编译器有关

在GCC下:

struct my 
{ 
	char ch;
	int a;
}  // 非紧凑模式
// sizeof(int)为4
// sizeof(my)为8 

struct my 
{ 
	char ch;
	int a;
} attrubte ((packed)) // 紧凑模式
// sizeof(int)为4
// sizeof(my)为5
<think>好的,用户现在问的是如何在使用typedef定义结构体时应用__attribute__((packed))。之前他们询问过Linux编译时如何不优化结构体存储,所以我需要确保这次的回答在之前的基础上补充新的信息,但不要重复太多。 首先,我需要回想之前的回答,其中已经介绍了结构体打包的两种方法,特别是__attribute__((packed))和#pragma pack。现在用户的问题更具体,涉及到typedef的使用,可能需要调整语法。 接下来,我需要确定正确的语法形式。在C语言中,当用typedef定义结构体时,如何正确放置属性是关键。可能的语法有两种:一种是先定义结构体,再typedef并添属性;另一种是在定义结构体的同时进行typedef。需要确认这两种方式的正确性,以及是否在某些编译器中会有不同的表现。 然后,我需要考虑用户可能遇到的问题,例如语法错误或者编译器兼容性问题。比如,GCC和Clang可能支持在typedef行添属性,而其他编译器可能不支持,这时候就需要用其他方法。 另外,用户可能想知道为什么需要这样做,或者这样做的应用场景是什么。可能需要结合之前的应用场景,比如网络协议或硬件寄存器映射,来举例说明。 还要注意提醒用户使用packed可能带来的问题,比如性能下降或对齐问题,这和之前的注意事项部分应该一致,但需要针对typedef的情况来强调。 可能用户在使用typedef时,结构体名称和别名之间的关系不太清楚,所以需要明确如何正确地在typedef过程中应用属性,确保结构体本身被正确打包,而不是仅仅别名。 最后,检查是否有遗漏的细节,比如是否需要同时给结构体定义和别名添属性,或者是否需要使用不同的语法格式。需要确保示例代码正确无误,能够编译通过,并且结构体确实被正确打包。</think>在 C 语言中,当使用 `typedef` 定义结构体时,`__attribute__((packed))` 的语法需要特别注意作用域。以下是两种常见写法及其区别: --- ### 一、标准写法(推荐) 将属性直接附结构体定义上: ```c typedef struct __attribute__((packed)) { char a; int b; short c; } Example; ``` - **作用对象**:结构体本身 - **效果**:该结构体类型的所有实例均无填充
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值