Cosa devo #includere per usare htonl?

Cosa devo #includere per usare htonl?


Voglio usare il htonl funzione nella mia estensione ruby ​​c, ma non voglio usare nessuna delle altre cose di Internet che ne derivano. Quale sarebbe il file più minimalista per #include è ancora portatile? Esaminando i file di intestazione sul mio computer, posso vedere che machine/endian.h o sys/_endian.h me li farebbe usare, anche se non sono sicuro che sia una buona idea.


Risposte:


L'intestazione standard è:


#include <arpa/inet.h>

Non devi preoccuparti delle altre cose definite in quell'intestazione. Non influirà sul codice compilato e dovrebbe avere solo un effetto minore sul tempo di compilazione.


EDIT:puoi testarlo. Crea 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);
}

Assemblali a -O1, quindi prendi 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.