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
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.
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.
- 1. Konvertierung von void * zu htonl verwenden
- 2. Was sollte ich anstelle von isinstance() verwenden
- 3. Sollte ich jQuery.inArray() verwenden?
- 4. Sollte ich Fremdschlüssel verwenden?
- 5. Sollte ich Bootstrap verwenden?
- 6. Sollte ich jQuery.each() verwenden?
- 7. Wie sollte ich SCM verwenden?
- 8. htons(), htonl(), ntohs(), ntohl() für enums
- 9. Wann sollte ich getElementById verwenden?
- 10. Wann sollte ich RESTful verwenden?
- 11. Welche sollte ich verwenden? (Leistung)
- 12. Was sollte ich anstelle des veralteten UISegmentedControlStyleBezeile in iOS5.1 verwenden?
- 13. GKSession ist in iOS7 veraltet, was sollte ich jetzt verwenden?
- 14. Was sollte ich für eine BigInt-Klasse in .NET verwenden?
- 15. Wenn window.navigator.userAgent veraltet ist, was sollte ich stattdessen verwenden?
- 16. Was ich verwenden sollte, um 2D-Hintergrund zu erstellen
- 17. Erweiterung kann nicht erweitert werden; Was sollte ich stattdessen verwenden?
- 18. Was sollte ich anstelle von Syncdb in Django 1.9 verwenden?
- 19. Javas Scanner vs String.split() vs StringTokenizer; Was sollte ich verwenden?
- 20. Was sollte ich verwenden, um Web Services App zu erstellen?
- 21. Was ist ein Volltextindex und wann sollte ich ihn verwenden?
- 22. Was ist semantisches Markup und warum sollte ich das verwenden?
- 23. Was 3D-Editor-Tool sollte ich mit Panda3D verwenden
- 24. Was sollte ich in Prism-MEF oder Unity verwenden?
- 25. Was .gitignore sollte ich mit QT-Projekten verwenden? (QT Creator)
- 26. Welches RDBMS sollte ich verwenden?
- 27. Welchen Fehlerwert sollte ich verwenden?
- 28. Welches Layout sollte ich verwenden?
- 29. Sollte ich Laravel Middleware verwenden?
- 30. Welches JSObject sollte ich verwenden?
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