Как объявить упакованную структуру (без заполнения) для 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 в приведенном выше примере кода.
Ответы
Ответ 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;
работал.