2010-07-04 10 views
7

Ich möchte die Funktion htonl in meiner Ruby-c-Erweiterung verwenden, aber ich möchte keines der anderen Internet-Zeug verwenden, das mit ihm kommt. Was wäre die minimalistischste Datei zu #include, die immer noch tragbar ist? Wenn ich durch die Header-Dateien auf meinem Computer schaue, kann ich sehen, dass entweder machine/endian.h oder sys/_endian.h ich sie verwenden könnte, obwohl ich nicht sicher bin, ob das eine gute Idee ist.Was sollte ich "htonl" verwenden?

Antwort

8

Der standard Header ist:

#include <arpa/inet.h> 

Sie müssen über die anderen Sachen in diesem Header definiert keine Sorge. Dies wirkt sich nicht auf den kompilierten Code aus und sollte sich nur geringfügig auf die Kompilierungszeit auswirken.

EDIT: Sie können dies testen. Erstellen Sie zwei Dateien, 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); 
} 

und htonl_include.c:

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

Montieren sie bei -O1, dann die Differenz nehmen:

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 

Für mich, der einzige Unterschied ist der Dateiname.

+0

Danke! Ich wusste nicht, dass es den kompilierten Code nicht ändern würde. Bevor du geantwortet hast, habe ich darüber nachgedacht, meine eigene Version zu schreiben, damit mein Code klein bleiben kann. – Adrian

0

Wenn Sie keine netzwerkbezogenen Informationen hinzufügen möchten, können Sie auch htonl selbst deklarieren. #include <stdint.h> Nur um uint32_t und verwenden Sie den folgenden Prototyp:

uint32_t htonl(uint32_t);

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

Sie können auch Ihre eigenen durch Testen Byte-Reihenfolge nur implementieren (bei compiletime) mit Gewerkschaften. Dies erfordert keine ungeraden ENDIAN-Makros oder #ifdefs.

Verwandte Themen