是否在typedef声明中忽略了__attribute __((__ package ___))?

时间:2012-08-31 10:52:22

标签: c data-structures attributes typedef

虽然__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:是的,我本可以验证一下,但目前情况有所不同。让我们说假期和智能手机!

4 个答案:

答案 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;