C de la définition de Macros pour déterminer big endian ou little endian machine?

Est-il une ligne de définition de macro pour déterminer le boutisme de la machine. Je suis en utilisant le code suivant, mais en la convertissant en macro serait trop long.

unsigned char test_endian( void )
{
    int test_var = 1;
    unsigned char test_endian* = (unsigned char*)&test_var;

    return (test_endian[0] == NULL);
}
  • Pourquoi ne pas inclure le même code dans une macro?
  • Vous ne pouvez pas déterminer de façon portable endianness avec le préprocesseur C seul. Vous aussi vous voulez 0 au lieu de NULL dans votre test final, et de modifier l'un des test_endian objets à autre chose :-).
  • Pourquoi avez-vous besoin d'une macro?
  • Aussi pourquoi un macro-elle nécessaire? Fonction Inline ferait la même chose, et il est beaucoup plus sûr.
  • Est-ce un casse-tête/devoir à la maison? Normalement, vous ne devriez pas réellement besoin de s'inquiéter à propos de l'endianness de votre plate-forme.
  • une macro est intéressante car sa valeur peut être connu au moment de la compilation, ce qui signifie que vous pouvez utiliser votre plate-forme de stockage de contrôle de l'instanciation d'un modèle, par exemple, ou peut-être même de sélectionner les différents blocs de code avec un #if directive.
  • Lors de l'écriture d'une application réseau ou une application qui exporte des données binaires dans un fichier, sachant que le stockage et correctement la manipulation de conversions est critique. Par exemple, si un Sun SPARC (big endian) et un serveur d'Intel x86 (little endian) serveur de swap de données binaires, l'un des deux devra convertir les données seront mal interprétés. Vous pouvez utiliser ntohl(), htonl(), ntohs(), ou htons(), mais ils ne poignée de 32 bits et 16 bits types de données.
  • Le format des données sur le fil doit être connues format spécifié (généralement de réseau de commande). Vous n'avez pas besoin de connaître le boutisme de votre plate-forme pour écrire à ce format, vous pouvez écrire endian-agnostique code par l'écriture d'un octet à la fois (par exemple,fputc((value >> 24) & 0xFF, fp), fputc((value >> 16) & 0xFF, fp) ...)
  • C'est vrai, mais inefficace. Si j'ai un little-endian cpu, et je suis en train d'écrire little-endian données au fil ou à un fichier, je préfère éviter le déballage et le remballage de données sans but. J'ai utilisé pour écrire des pilotes vidéo pour une vie. Il est extrêmement important lors de l'écriture des pixels à une carte vidéo pour optimiser chaque endroit que vous le pouvez.

InformationsquelleAutor manav m-n | 2010-01-20