首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >__attribute__ ((__packed__))是否会被忽略?

__attribute__ ((__packed__))是否会被忽略?
EN

Stack Overflow用户
提问于 2012-08-31 10:52:21
回答 4查看 42.2K关注 0票数 25

尽管__attribute__ ((aligned))可以很好地处理ty胡枝子f声明,如:

代码语言:javascript
复制
typedef struct __attribute__((__aligned__(8))) A {

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

我遇到过这样的声明,其中说,__attribute__ ((__packed__))和this的情况并非如此!我正在研究一些相关的问题,其中一些问题已经使用了类型胡枝子的填充属性,这与我们的代码是一致的。

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

代码语言:javascript
复制
typedef struct {
     xxx ip    ;
     xxx udp   ;
     xxx ports ;
}__attribute__((packed)) table ;

上面的声明是否让编译器悄悄地转储打包的属性声明?

PS :是的,我本可以核实的,但是我的情况与.Lets所说的假期和智能手机的情况不同!

EN

回答 4

Stack Overflow用户

发布于 2012-08-31 14:32:20

声明看起来没问题。然而,尝试坚持以下之一,以避免沉默的属性丢弃。

代码语言:javascript
复制
#include <stdio.h>

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

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

代码语言:javascript
复制
#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,我认为最好避免它的声明这里,并尝试旧的学校结构声明风格。

票数 22
EN

Stack Overflow用户

发布于 2016-05-12 10:51:31

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

票数 10
EN

Stack Overflow用户

发布于 2012-08-31 10:58:09

你在这里合并了两个陈述。

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

当您将打包属性分配给别名时,此别名使用的已经创建的数据结构不会被更改。(通常,您可以使用由"typedef struct bla {} s_bla“创建的"struct”和"s_bla“来创建变量,并相互交换这些值。如果可以使用ty胡枝子f来更改结构,这种一致性就会中断。)

所以:声明将被丢弃。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12213866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档