__attribute__ ((__packed__)); 怎么用?

我这有一程序,用gcc就不行 和 keil 编译后运行正确。
这两个编译时的不同之处就是__attribute__ ((__packed__))与__packed这两个地方。
请求大侠们给点提示,它们正确的用法是什么?放的位置是在哪里?
*((__packed DWORD * )pData) = RX_DATA;
用gcc 应该怎么用?这是什么意思?
谢谢啦!

1. __attribute__是GNU C对标准C语法的扩展,是GNU C的一大特色,可以用于设置函数的属性,变量的属性,类型的属性

packed属性:使用该属性可以使得变量或者结构体成员使用最小的对齐方式,即对变量是一字节对齐,对域(field)是位对齐。
使用该属性对 struct或者union类型进行定义,设定其类型的每一个变量的内存约束。当用在 enum类型定义时,暗示了应该使用最小完整的类型 。
下面的例子中,x成员变量 使用了该属性,则其值将紧放置在a的后面:
struct test
{
char a;
int x[2] __attribute__ ((packed));
};

像下面的结构体,结构体的长度,就是各个变量长度的和
struct student
{
char name[7];
uint32_t id;
char subject[5];
} __attribute__ ((packed));

下面的 例子中,my-packed-struct类型的变量数组中的值将会紧紧的靠在一起,但内部 的成员变量s不会被“pack”,如果希望内部的成员变量也被packed,my- unpacked-struct也需要使用packed进行相应的约束。
struct my_packed_struct
{
char c;
int i;
struct my_unpacked_struct s;
} __attribute__ ( (__packed__) );

2. __packed是进行一字节对齐。使用_packed一般会以降低运行性能为代价,由于大多数cpu处理数据在合适的字节边界数的情况下会更有效,packed的使用会破坏这种自然的边界数。

typedef struct1
{
char x;
int y;
}struct1;
typedef __packed struct2
{
char x;
int y;
}struct2;在32位的ARM SDT编译器中
sizeof(struct1)值为8
sizeof(struct2)值为5;
温馨提示:答案为网友推荐,仅供参考
相似回答