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

Bor*_*ito 17 c attributes typedef data-structures

虽然__attribute__ ((aligned))适用于typedef声明,例如:

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

     xxx ip    ;
     xxx udp   ;
     xxx ports ;
} table ;
Run Code Online (Sandbox Code Playgroud)

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

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

typedef struct {
     xxx ip    ;
     xxx udp   ;
     xxx ports ;
}__attribute__((packed)) table ;
Run Code Online (Sandbox Code Playgroud)

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

PS:是的,我本可以验证一下,但我现在的情况有所不同.让我们说假期和智能手机!

use*_*471 15

声明似乎对我好!

它可以通过以下方式之一声明.

#include <stdio.h>

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

int main(void) {

printf("%d",sizeof(NCO));
} 
Run Code Online (Sandbox Code Playgroud)

要么

#include <stdio.h> 
   typedef struct  {
    char old;
    int ip;
    int new;
} __attribute__((packed)) NCO;

int main(void) {

printf("%d",sizeof(NCO));
} 
Run Code Online (Sandbox Code Playgroud)

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

虽然它给我们的压缩大小9,我觉得这是更好地避免它说这里并尝试旧的办学格局声明风格.

  • 最后一次编辑似乎在第二个片段中引入了错误。名称“NCO”和分号似乎丢失了。 (3认同)

kla*_*syc 8

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


Nip*_*pey 4

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

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

当您将 Packed-Property 分配给别名时,该别名使用的已创建数据结构将不会更改。(通常您可以使用“struct bla”和“s_bla”创建变量[由“typedef struct bla {} s_bla”创建]并相互交换这些值。如果可以使用 typedef 更改结构,则这种一致性会破裂。)

所以:该声明将被丢弃。