Подтвердить что ты не робот

Как объявить упакованную структуру (без заполнения) для LLVM?

Можно рассказать GCC, что он не должен использовать дополнение для структуры. Это делается с помощью __attribute__((packed)).

typedef struct {

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

} PacketData __attribute__((packed));

Однако новейший Xcode использует LLVM и не распознает атрибут. Как определить упакованную структуру для LLVM?

Полное описание проблемы можно найти здесь

UPDATE Я использую Xcode 4.5.1 для iOS, который использует компилятор Apple LLVM 4.1. Я получаю "упакованный" атрибут ignored "предупреждение в Xcode в приведенном выше примере кода.

4b9b3361

Ответ 1

Вы действительно попробовали? Я просто протестировал его на своей машине, а __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.

Заключение: кажется, что атрибут должен превышать метку структуры, чтобы заставить это работать.

Ответ 2

Вы можете использовать директиву препроцессора, чтобы указать выравнивание байтов для структуры, поэтому компилятор не будет дополняет заполнение:

#pragma pack(1)

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

#pragma options align=reset

Смотрите ответ на этот вопрос на stackoverflow.

Ответ 3

clang 3.5 в Linux -

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

работал.