虽然__attribute__ ((aligned))
适用于typedef声明,例如:
typedef struct __attribute__((__aligned__(8))) A {
xxx ip ;
xxx udp ;
xxx ports ;
} table ;
我遇到过一些声明,说__attribute__ ((__packed__))
与typedef的情况并非如此!我正在阅读一些相关问题,其中一些人使用了带有typedef的packed属性,该属性与我们的代码相符。
现在,在我们的代码中我们定义
typedef struct {
xxx ip ;
xxx udp ;
xxx ports ;
}__attribute__((packed)) table ;
上述声明是否使编译器静默转储打包属性声明?
PS:是的,我本可以验证一下,但目前情况有所不同。让我们说假期和智能手机!答案 0 :(得分:12)
声明似乎对我好!
可以用其中一种方式声明。
#include <stdio.h>
typedef struct __attribute__((packed)) {
char old;
int ip;
int new;
} NCO;
int main(void) {
printf("%d",sizeof(NCO));
}
或
#include <stdio.h>
typedef struct {
char old;
int ip;
int new;
} __attribute__((packed)) NCO;
int main(void) {
printf("%d",sizeof(NCO));
}
确保__attribute__((packed))
关键字和属性规范紧跟在结构声明的右大括号(})之后。如果它处于任何其他位置(例如,在结构实例之后而不是在结构实例之前),则编译器将忽略__attribute__((packed))
并发出警告消息。
虽然它为我们提供了打包大小9
,但我认为最好像here所述避免它,并尝试旧的学校结构声明风格。
答案 1 :(得分:7)
您的声明似乎没问题,但它是编译器依赖的。例如,如果您想让MinGW编译器尊重它,则必须使用 -mno-ms-bitfields 参数编译程序。如果您没有指定此标志,则不会发出警告,但该属性不受尊重!
答案 2 :(得分:1)
你在这里结合了两个陈述。
首先,您定义具有特定属性的结构。 然后为它创建一个别名。
将packed-property分配给别名时,此别名使用的已创建数据结构不会更改。 (通常你可以使用“struct bla”和“pipesla”创建变量[由“typedef struct bla {} pipesla”创建]并在彼此之间交换这些值。如果可以通过使用typedef来改变结构,这种一致性会破裂。)
所以:声明将被转储。
答案 3 :(得分:0)
试试这样。这可能有用。
struct test
{
unsigned char field1;
unsigned short field2;
unsigned long field3;
}__attribute__((__packed__));
typedef struct test test_t;
test_t var1, var2;