Comment déclarer une structure compressée (sans padding) pour LLVM?

Il est possible de dire à GCC qu’il ne devrait pas utiliser de remplissage pour la structure. Ceci est fait en utilisant __atsortingbute__((packed)) .

 typedef struct { uint8_t startSymbol; uint8_t packetType; uint32_t deviceId; uint16_t packetCRC; } PacketData __atsortingbute__((packed)); 

Cependant, le dernier Xcode utilise LLVM et ne reconnaît pas l’atsortingbut. Comment définir une structure compacte pour LLVM?

La description complète du problème peut être trouvée ici

UPDATE J’utilise Xcode 4.5.1 pour iOS qui utilise le compilateur Apple LLVM 4.1. Je reçois l’avertissement “‘atsortingbut’ emballé ‘ignoré” dans Xcode dans l’exemple de code ci-dessus.

L’avez-vous réellement essayé? Je viens de le tester sur ma machine et __atsortingbute__((packed)) clang compilé à l’aide de clang .

Edit: J’ai le même avertissement (“Attention: atsortingbut emballé non utilisé”) pour

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

et dans ce cas, sizeof(mystruct) était 8.

cependant,

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

a fonctionné très bien, et sizeof(mystruct) était 5.

Conclusion: il semble que l’atsortingbut doive précéder le struct label pour que cela fonctionne.

Vous pouvez utiliser la directive preprocessor pour spécifier l’alignement d’octet pour la structure afin qu’aucun remplissage ne soit effectué par le compilateur:

#pragma pack(1)

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

#pragma options align=reset

Voir la réponse à cette question sur stackoverflow.

Clang 3.5 sur Linux –

  typedef struct __atsortingbute __ ((emballé)) thing1 {int blah;  } THING_ONE; 

travaillé.