1

我对以下代码感到非常困惑:

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 位长,所以这不应该是问题,对吧?

4

2 回答 2

2

结构成员 a 通常填充到一个字长。

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

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

在这种情况下sizeof(packed_struct)会给你3

不幸的是,您将按程序性能为此付费。

于 2013-02-21T13:30:02.503 回答
2

Uint16不是 C 中的标准类型,所以它的大小取决于它被typedef编辑的内容。

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

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

我一个都不知道。如果您有权访问代码,则使用short而不是int很可能会起作用。如果stdint.h可用,uint16_t/int16_t将起作用(除非平台上没有 16 位整数类型)。

于 2013-02-21T14:14:32.520 回答