如何为LLVM声明压缩结构(没有填充)?

时间:2012-12-03 17:32:44

标签: objective-c c struct

可以告诉GCC它不应该为结构使用填充。这是使用__attribute__((packed))完成的。

typedef struct {

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

} PacketData __attribute__((packed));

但是,最新的Xcode使用LLVM并且无法识别该属性。如何为LLVM定义压缩结构?

可能会找到问题的完整描述here

UPDATE 我正在使用Xcode 4.5.1 for iOS,它使用Apple LLVM 4.1编译器。我在上面的代码示例中的Xcode中收到“'packed'属性被忽略”警告。

3 个答案:

答案 0 :(得分:24)

你真的尝试过吗?我刚刚在我的机器上测试了它,__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。

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

答案 1 :(得分:7)

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

#pragma pack(1)

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

#pragma options align=reset

请参阅stackoverflow上this问题的答案。

答案 2 :(得分:0)

Linux上的

clang 3.5 -

typedef struct  __attribute__((packed)) thing1 { int blah; } THING_ONE;

的工作。