Comment déclarer des paniers struct (sans rembourrage) pour LLVM?
Il est possible de demander à GCC il ne devrait pas utiliser de rembourrage pour les struct. Ceci est fait en utilisant __attribute__((packed))
.
typedef struct {
uint8_t startSymbol;
uint8_t packetType;
uint32_t deviceId;
uint16_t packetCRC;
} PacketData __attribute__((packed));
Cependant, le plus récent Xcode utilise LLVM et ne reconnaît pas l'attribut. Comment définir paniers struct pour LLVM?
La description complète du problème est peut-être trouvé ici
Mise à JOUR je suis en utilisant Xcode 4.5.1 pour iOS, qui utilise Apple LLVM 4.1 compilateur. Je suis "'paniers' attribut ignoré" avertissement dans Xcode dans l'exemple de code ci-dessus.
Ai-je raté quelque chose ou c'est un très nouvelle fonctionnalité de suppression? La dernière fois que j'ai vérifié, clang pris en charge
clang soutient exactement le même
N'ai aucune idée 🙂 je suis en utilisant Xcode 4.5.1 pour iOS, qui utilise Apple LLVM 4.1 compilateur.
J'ai trouvé la réponse, consultez le modifier.
__attribute__((packed))
...clang soutient exactement le même
__attribute__((packed))
pragma...N'ai aucune idée 🙂 je suis en utilisant Xcode 4.5.1 pour iOS, qui utilise Apple LLVM 4.1 compilateur.
J'ai trouvé la réponse, consultez le modifier.
OriginalL'auteur Centurion | 2012-12-03
Vous devez vous connecter pour publier un commentaire.
Avez-vous vraiment l'essayer? Je l'ai juste testé sur ma machine, et
__attribute__((packed))
compilé amende à l'aideclang
.Edit: j'ai eu le même avertissement ("Warning: emballé attribut non utilisé") pour
et dans ce cas
sizeof(mystruct)
était de 8.Cependant,
a très bien fonctionné, et
sizeof(mystruct)
était de 5.Conclusion: il semble que l'attribut doit précéder la structure de l'étiquette afin d'obtenir ce travail.
Ensuite, vérifiez
sizeof(PacketData)
pour voir si l'avertissement est discutable. Clang sur Linux gère le pragma l'amende juste.N'est-ce pas dire qu'il est reconnu/pris en charge tout simplement pas l'habitude? Êtes-vous réellement l'instanciation de la structure de n'importe où dans le code?
Pas de problème, je suis content d'avoir pu aider. 🙂
De le mettre sur la dernière ligne marche aussi: "} __attribute__((emballé)) mystruct;"
OriginalL'auteur
Vous pouvez utiliser la directive de préprocesseur pour spécifier l'alignement d'octets de la structure, donc pas de rembourrage sera fait 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 à la cette question sur stackoverflow.
OriginalL'auteur us_david
clang 3.5 sur Linux -
travaillé.
y compris le (nom?) entre les ((emballé)) et le "{ int bla; }" est différent je crois.
OriginalL'auteur rsgmodelworks