20

可以告诉 GCC 它不应该对结构使用填充。这是使用__attribute__((packed)).

typedef struct {

  uint8_t startSymbol;
  uint8_t packetType;
  uint32_t deviceId;
  uint16_t packetCRC;

} PacketData __attribute__((packed));

但是,最新的 Xcode 使用 LLVM 并且不识别该属性。如何为 LLVM 定义打包结构?

问题的完整描述可以在这里找到

更新 我正在使用适用于 iOS 的 Xcode 4.5.1,它使用 Apple LLVM 4.1 编译器。在上面的代码示例中,我在 Xcode 中收到“'packed' attribute ignored”警告。

4

3 回答 3

32

你真的试过了吗?我刚刚在我的机器上对其进行了测试,并__attribute__((packed))使用clang.

编辑:我收到了相同的警告(“警告:未使用的打包属性”)

typedef struct {
    int a;
    char c;
} mystruct __attribute__((packed));

在这种情况下sizeof(mystruct)是8。

然而,

typedef struct __attribute__((packed)) {
    int a;
    char c;
} mystruct;

工作得很好,sizeof(mystruct)是5。

结论:似乎该属性需要在结构标签之前才能使其正常工作。

于 2012-12-03T17:38:30.900 回答
9

您可以使用预处理器指令为结构指定字节对齐,因此编译器不会进行填充:

#pragma pack(1)

typedef struct {
char        t1;
long long   t2;
char        t3;
} struct_size_test;

#pragma options align=reset

在 stackoverflow 上查看这个问题的答案。

于 2014-08-27T16:58:00.793 回答
0

Linux 上的 clang 3.5 -

typedef struct __attribute__((packed)) thing1 { int blah; } 东西一;

工作。

于 2018-02-20T20:36:40.570 回答