2010-07-04 34 views
7

Quiero usar la función htonl en mi extensión ruby ​​c, pero no quiero usar ninguna de las otras cosas de Internet que vienen con ella. ¿Cuál sería el archivo más minimalista en #include que todavía es portátil? Al mirar a través de los archivos de cabecera en mi computadora, puedo ver que machine/endian.h o sys/_endian.h me permiten usarlos, aunque no estoy seguro de si es una buena idea.¿Qué debo #incluir para usar 'htonl'?

Respuesta

8

La cabecera es standard:

#include <arpa/inet.h> 

Usted no tiene que preocuparse de las otras cosas que se define en la cabecera. No afectará su código compilado, y debería tener solo un efecto menor en el tiempo de compilación.

EDITAR: Puede probar esto. Crear dos archivos, 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); 
} 

y htonl_include.c:

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

ensamblarlos en -O1, luego tomar la diferencia:

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 

Para mí, la única diferencia es el nombre del archivo

+0

Gracias! No sabía que no cambiaría el código compilado. Antes de responder, estaba considerando escribir mi propia versión solo para que mi código pudiera ser pequeño. – Adrian

0

Si no desea incluir nada relacionado con la red, es perfectamente válido declarar htonl usted mismo. Sólo #include <stdint.h> para obtener uint32_t y utilizar el siguiente prototipo:

uint32_t htonl(uint32_t);

Referencia: POSIX: http://www.opengroup.org/onlinepubs/9699919799/functions/htonl.html

Puede también acaba de poner en práctica su propia por orden de bytes de la prueba (en tiempo de compilación) utilizando uniones. Esto no requiere ninguna ENDREGIA macros o #ifdefs.

Cuestiones relacionadas