2012-12-03 12 views
12

Można powiedzieć GCC, że nie powinien używać dopełnienia dla struktury. Odbywa się to za pomocą __attribute__((packed)).Jak zadeklarować spakowaną strukturę (bez wypełnienia) dla LLVM?

typedef struct { 

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

} PacketData __attribute__((packed)); 

Jednak najnowszy Xcode używa LLVM i nie rozpoznaje atrybutu. Jak zdefiniować strukturę upakowaną dla LLVM?

Pełen opis problemu można znaleźć here

UPDATE Używam Xcode 4.5.1 dla iOS firmy Apple, który używa kompilatora LLVM 4.1. Otrzymuję "pakowany" atrybut ignorowany "ostrzeżenie w Xcode w powyższym przykładzie kodu.

+0

Czy brakuje mi czegoś lub jest to bardzo nowa funkcja usuwania? Ostatni raz kiedy sprawdziłem, clang wspierany '__attribute __ ((spakowany))' ... –

+0

clang obsługuje dokładnie to samo '__attribute __ ((pakowane))' pragma ... – birryree

+0

Nie mam pojęcia :) Używam Xcode 4.5. 1 dla iOS, który używa kompilatora Apple LLVM 4.1. – Centurion

Odpowiedz

21

Czy rzeczywiście tego spróbowałeś? Właśnie przetestowałem to na mojej maszynie i __attribute__((packed)) skompilowałem dobrze używając clang.

Edit: Mam ten sam ostrzeżenia ("Warning: pakowane atrybutu niewykorzystana") dla

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

iw tym przypadku sizeof(mystruct) był 8.

Jednak

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

działa dobrze, a sizeof(mystruct) był 5.

Wniosek: wygląda na to, że atrybut musi poprzedzić etykietę struct, aby to działało.

+0

Tak, zrobiłem to właśnie teraz. Używam Xcode 4.5.1 dla iOS, który używa kompilatora Apple LLVM 4.1. Otrzymuję "pakowany" atrybut ignorowany "ostrzeżenie w Xcode – Centurion

+0

@Centurion Następnie sprawdź' sizeof (PacketData) ', aby zobaczyć, czy ostrzeżenie jest dyskusyjne. Clang na Linuksie radzi sobie z pragmą w porządku. – chrisaycock

+0

@Centurion Czy to nie oznacza, że ​​jest rozpoznany/obsługiwany po prostu nieużywany? Czy faktycznie tworzysz instancję w dowolnym miejscu kodu? –

5

Można użyć dyrektywy preprocesora, aby określić wyrównanie bajtów do struct tak nie wyściółka będą wykonywane przez kompilator:

#pragma pack(1)

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

#pragma options align=reset

Zobacz odpowiedź na pytanie this na stackoverflow.

0

dzyń 3.5 na Linuksie -

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

pracował.

+0

Była już odpowiedź stwierdzająca dokładnie to, dlaczego dodać kolejne? – Johan

Powiązane problemy