23

虽然__attribute__ ((aligned))与 typedef 声明配合得很好,例如:

typedef struct __attribute__((__aligned__(8))) A {

     xxx ip    ;
     xxx udp   ;
     xxx ports ;
} table ;

我遇到过声明说__attribute__ ((__packed__)) typedef 不是这种情况!我正在处理一些相关的问题,其中一些使用了带有 typedef 的打包属性,这与我们的代码相符。

现在,在我们的代码中,我们定义

typedef struct {
     xxx ip    ;
     xxx udp   ;
     xxx ports ;
}__attribute__((packed)) table ;

上述声明是否使编译器静默转储打包的属性声明?

PS:是的,我可以验证它,但我现在的情况不同。假设是假期和智能手机!

4

4 回答 4

22

声明看起来不错。但是,请尝试遵守以下其中一项以避免静默属性丢弃。

#include <stdio.h>

typedef struct __attribute__((packed)) {
    char old;
    int ip;
    int new;
} NCO;

int main(void)
{ 
    printf("%zu", sizeof(NCO));
} 

或者

#include <stdio.h> 

typedef struct {
    char old;
    int ip;
    int new;
} __attribute__((packed)) 

int main(void)
{
    printf("%zu", sizeof(NCO));
} 

确保__attribute__((packed))关键字和属性规范紧跟结构声明的右大括号 (})。如果它位于任何其他位置(例如,在结构实例之后而不是在结构实例之前),编译器应忽略 __attribute__((packed))并发出警告消息。

虽然它为我们提供了打包的大小9,但我认为最好避免它,如这里所述,并尝试旧的学校结构声明风格。

于 2012-08-31T14:32:20.300 回答
10

您的声明似乎没问题,但它取决于编译器。例如,如果你想让 MinGW 编译器尊重它,你必须使用-mno-ms-bitfields参数编译你的程序。如果您不指定此标志,则不会发出警告,但不会尊重该属性!

于 2016-05-12T10:51:31.790 回答
4

您在这里合并了两个语句。

首先,您定义具有某些属性的结构。然后为它创建一个别名。

当您将打包属性分配给别名时,不会更改此别名使用的已创建数据结构。(通常您可以使用“struct bla”和“s_bla”[由“typedef struct bla {} s_bla”创建]创建变量并在彼此之间交换这些值。如果可以使用 typedef 更改结构,则这种连贯性会破裂。)

所以:声明将被转储。

于 2012-08-31T10:58:09.047 回答
0

像这样试试。这可能会奏效。

struct test
{
 unsigned char  field1;
 unsigned short field2;
 unsigned long  field3;
 }__attribute__((__packed__));

typedef struct test test_t;

test_t var1, var2;
于 2012-08-31T11:32:18.307 回答