20

構造体にパディングを使用しないようにGCCに指示することができます。これはを使用して行われ__attribute__((packed))ます。

typedef struct {

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

} PacketData __attribute__((packed));

ただし、最新のXcodeはLLVMを使用しており、属性を認識しません。LLVMのパック構造体を定義する方法は?

問題の完全な説明はここにあります

更新 AppleLLVM4.1コンパイラを使用するiOS用のXcode4.5.1を使用しています。上記のコード例のXcodeで「'packed'属性が無視されました」という警告が表示されます。

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上のclang3.5-

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

働いた。

于 2018-02-20T20:36:40.570 に答える