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
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.
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.
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