2010-07-04 6 views
7

Je souhaite utiliser la fonction htonl dans mon extension ruby ​​c, mais je ne souhaite pas utiliser d'autres éléments Internet qui l'accompagnent. Quel serait le fichier le plus minimaliste à #include qui est encore portable? En regardant à travers les fichiers d'en-tête sur mon ordinateur, je peux voir que machine/endian.h ou sys/_endian.h me permet de les utiliser, même si je ne suis pas sûr que ce soit une bonne idée.Que dois-je # inclure pour utiliser 'htonl'?

Répondre

8

L'en-tête est standard:

#include <arpa/inet.h> 

Vous n'avez pas à vous soucier de l'autre substance définie dans cet en-tête. Cela n'affectera pas votre code compilé, et devrait avoir seulement un effet mineur sur le temps de compilation.

EDIT: Vous pouvez tester ceci. Créez deux fichiers, htonl_manual.c

// non-portable, minimalistic header 
#include <byteswap.h> 
#include <stdio.h> 
int main() 
{ 
    int x = 1; 
    x = __bswap_32(x); 
    printf("%d\n", x); 
} 

et htonl_include.c:

// portable 
#include <arpa/inet.h> 
#include <stdio.h> 
int main() 
{ 
    int x = 1; 
    x = htonl(x); 
    printf("%d\n", x); 
} 

les assembler à -O1, puis prendre la différence:

gcc htonl_manual.c -o htonl_manual.s -S -O1 
gcc htonl_include.c -o htonl_include.s -S -O1 
diff htonl_include.s htonl_manual.s 

Pour moi, la seule différence est le nom de fichier

+0

Merci! Je ne savais pas que cela ne changerait pas le code compilé. Avant de répondre, je pensais écrire ma propre version juste pour que mon code reste petit. – Adrian

0

Si vous ne voulez rien inclure en rapport avec le réseau, il est parfaitement possible de déclarer vous-même htonl. Juste #include <stdint.h> pour obtenir uint32_t et utiliser le prototype suivant:

uint32_t htonl(uint32_t);

Référence: Posix: http://www.opengroup.org/onlinepubs/9699919799/functions/htonl.html

Vous pouvez aussi implémenter votre propre par l'ordre des octets de test (à compiletime) à l'aide des syndicats. Cela ne nécessite aucune macros ENDIAN ou #ifdefs.

Questions connexes