-1
votes

Définir les macros à base d'endansion de la machine

Je veux définir des variables dans la structure basée sur l'endansion de la machine, c'est ce que j'ai essayé xxx

le code ci-dessus donne une erreur, est-ce possible pour atteindre. Mon objectif principal est de réaliser l'ordre inverse des variables de structure.


11 commentaires

Dupliqué possible de C Macro Définition pour déterminer grand Endian ou petite machine Endian?


Votre macro est une vérification d'exécution lorsque vous souhaitez un chèque de préprocesseur! (Pas même une compilation de compilation où vous pourriez utiliser des traits de type modernes pouvant vous donner de l'endansnité).


@Firelancer Oui Si vous n'aviez pas à propos de la définition de la structure, ce qui est, donc non, cette question n'est pas une duplication.


FWIW, C ++ 20 offre une valeur d'énorme pour cela. EN.CPPREFERATION.COM/W/CPP/TTTYPES/endian


Vous pouvez y accomplir sans le préprocesseur en utilisant la spécialisation de modèle ou std :: conditionnel_t . Y a-t-il une autre raison pour laquelle vous avez besoin pour être au moment de la période?


Notez également que la mise en page des champs de bit est définie par la mise en œuvre [classe.bit] / 1 . Sachez donc que cela est intrinsèquement pas une façon portable de faire des choses pour commencer avec ...


OTECHE COMMANDER FALLACY TLDR; L'ordre des octets de la machine n'a pas d'importance ce qui compte est l'ordre d'octet des données


La macro réponse comme __ byte_order__ fonctionnera avec le pré-processeur.


Type Punning via des syndicats en général est UB et je ne suis pas conscient qu'il existe une exception pour char ou char [] (comme existe pour les pointeurs, tout peut être lancé légalement. à char * ...)


Pourquoi voulez-vous cela? Voulez-vous sérialiser en imprimant simplement les octets de votre structure comme c'est le cas? C'est dangereux à d'autres égards, aussi - e. g. Alignement: struct s {int32_t i32; INT64_T I64; }; peut avoir une taille de 12 sur un compilateur 32 bits, mais sur 16 sur un compilateur 64 bits en raison d'un rembourrage des octets entre les deux membres!


Ne modifiez pas votre Question pour contenir une solution. Le format est Q & A, alors acceptez une réponse si elle contient une solution.


4 Réponses :



1
votes

Attendez jusqu'à C ++ 20 (ou utilisez des fonctionnalités expérimentales de votre compilateur) et vous pourrez utiliser C ++ Standard std :: Endian pour ce:

indique l'endansion de tous les types scalaires:

Si tous les types scalaires sont Little-Endian, STD :: Endian :: Native est égal à STD :: Endian :: Peu si tous les types scalaires sont Big-Endian, std :: Endian :: native équivalent STD :: Endian :: Big


0 commentaires

2
votes

Ce test ne peut pas fonctionner pour un pré-processeur si la directive si la directive.

Le prochain C ++ 20 est proposé d'avoir std :: Endian code>. Il peut être utilisé sans le pré-processeur. P> xxx pré>

avant C ++ 20, il n'y a pas de moyen standard d'obtenir l'endansité. P>

A portable La solution consiste à utiliser des macros prédéfinies pour détecter le système. Certains systèmes sont peu d'Endian (Windows), tandis que d'autres fournissent un en-tête avec des définitions de macro ( code> sous Linux, code> dans BSD et ainsi de suite) et d'autres peuvent être différents d'une autre manière. Le compilateur GCC fournit des macros: p>

__BYTE_ORDER__
__ORDER_LITTLE_ENDIAN__
__ORDER_BIG_ENDIAN__
__ORDER_PDP_ENDIAN__


0 commentaires

-1
votes

Merci @ Jarod42, le code suivant fonctionne pour moi xxx


0 commentaires