2010-07-04 16 views
7

Desidero utilizzare la funzione htonl nell'estensione Ruby c, ma non voglio utilizzare nessuna delle altre risorse Internet fornite con esso. Quale sarebbe il file più minimalista per #include che è ancora portatile? Guardando attraverso i file di intestazione sul mio computer, posso vedere che sia machine/endian.h o sys/_endian.h mi permettessero di usarli, anche se non sono sicuro che sia una buona idea.Che cosa dovrei # include usare 'htonl'?

risposta

8

L'intestazione standard è:

#include <arpa/inet.h> 

Non devi preoccuparti per le altre cose definita in quel colpo di testa. Non influenzerà il tuo codice compilato e dovrebbe avere solo un piccolo effetto sul tempo di compilazione.

MODIFICA: è possibile verificare questo. Creare due file, 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); 
} 

e htonl_include.c:

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

assemblarli in -O1, poi prendere la differenza:

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 

Per me, l'unica differenza è il nome del file.

+0

Grazie! Non sapevo che non avrebbe cambiato il codice compilato. Prima che tu rispondessi, stavo pensando di scrivere la mia versione solo in modo che il mio codice potesse rimanere piccolo. – Adrian

0

Se non si desidera includere nulla relativo alla rete, è perfettamente valido dichiarare lo htonl. Basta #include <stdint.h> per ottenere uint32_t e utilizzare il seguente prototipo:

uint32_t htonl(uint32_t);

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

È anche possibile implementare il proprio ordine per il test di byte (a compiletime) con i sindacati. Questo non richiede alcuna macro ENDIAN o #ifdefs.

Problemi correlati