我对以下代码感到困惑:
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位长,这应该不是问题,对吗?
答案 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
。
不幸的是,您将通过计划效果为此付出代价。