在使用GCC编译后,Uint16的大小为32位

时间:2013-02-21 13:27:53

标签: c gcc

我对以下代码感到困惑:

typedef struct
{
    Uint16          first:8;   // has a size of 8 bit
    Uint16          second:8;  // has a size of 8 bit
    Uint16          third;     // has a size of 32 bit; what's wrong here?
} TSomeStruct;

我希望“第三”的大小为16位而不是32位。我确定错误一定是我自己的。

背景:这不是我的代码库,我正在对它进行验证。因为它是为嵌入式系统和专有编译器编写的,我没有,我只是使用“-fdump-translation-unit”选项生成语法树并对其进行验证。但Uint16在GCC中也应该是16位长,这应该不是问题,对吗?

2 个答案:

答案 0 :(得分:2)

Uint16不是C中的标准类型,因此其大小取决于它typedef的内容。

typedef可能是unsigned int,因为在嵌入式平台的专有编译器中保证为16位。但是当使用x86平台的当前gcc进行编译时,它将成为32位类型。

  

有没有办法强制gcc使用16位而不是32位用于int

我一无所知。如果您有权访问该代码,那么使用short代替int很可能会有效。如果stdint.h可用,则uint16_t / int16_t将起作用(除非平台上没有16位整数类型)。

答案 1 :(得分:1)

结构成员通常填充到字大小。

为了强制编译器打包结构,有不同的方法。 我更喜欢下面的内容:

struct __attribute__((__packed__)) packed_struct {
    unsigned char a;
    unsigned char b;
    unsigned char c;
};

在这种情况下,sizeof(packed_struct)会为您提供3

不幸的是,您将通过计划效果为此付出代价。