2012-12-03 12 views
12

È possibile indicare a GCC che non dovrebbe utilizzare il riempimento per la struttura. Questo viene fatto usando __attribute__((packed)).Come dichiarare struct packed (senza padding) per LLVM?

typedef struct { 

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

} PacketData __attribute__((packed)); 

Tuttavia, il nuovo Xcode utilizza LLVM e non riconosce l'attributo. Come definire structed struct for LLVM?

La descrizione completa del problema potrebbe essere trovata here

UPDATE sto usando Xcode 4.5.1 per iOS di Apple che utilizza LLVM 4.1 del compilatore. Ricevo l'avviso "attributo" ignorato "in Xcode nell'esempio di codice sopra riportato.

+0

Mi manca qualcosa o questa è una rimozione di funzionalità molto nuova? L'ultima volta che ho controllato, clang ha supportato '__attribute __ ((packed))' ... –

+0

clang supporta lo stesso identico '__attribute __ ((packed))' pragma ... – birryree

+0

Non ho idea :) Sto usando Xcode 4.5. 1 per iOS che utilizza il compilatore Apple LLVM 4.1. – Centurion

risposta

21

Lo hai provato? L'ho appena testato sulla mia macchina e l'importo __attribute__((packed)) è stato compilato utilizzando clang.

Edit: ho ottenuto lo stesso avvertimento ("Attenzione: imballato attributo inutilizzato") per

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

e in questo caso è stato sizeof(mystruct) 8.

Tuttavia,

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

ha funzionato bene, e sizeof(mystruct) era 5.

Conclusione: sembra che l'attributo abbia bisogno di precedere l'etichetta struct per farlo funzionare.

+0

Sì, l'ho fatto solo ora. Sto usando Xcode 4.5.1 per iOS che utilizza il compilatore Apple LLVM 4.1. Ricevo l'avviso "attributo" ignorato "in Xcode – Centurion

+0

@Centurion Quindi controlla' sizeof (PacketData) 'per vedere se l'avviso è discutibile. Clang su Linux gestisce il pragma bene. – chrisaycock

+0

@Centurion Non significa che è riconosciuto/supportato solo non usato? Stai istanziando la struttura in qualche punto del codice? –

5

È possibile utilizzare direttiva del preprocessore per specificare l'allineamento di byte per la struct quindi senza imbottitura sarà fatto dal compilatore:

#pragma pack(1)

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

#pragma options align=reset

Vedere la risposta alla domanda this sullo stackoverflow.

0

clangore 3.5 su Linux -

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

lavorato.

+0

C'era già una risposta che affermava esattamente questo, perché aggiungerne un'altra? – Johan