我想在我的ruby c擴展中使用htonl
函數,但不想使用隨附的任何其他Internet工具。 #include
最簡約的文件是什麼?通過我的電腦上的頭文件,我可以看到machine/endian.h
或sys/_endian.h
會讓我使用它們,但我不確定這是否是一個好主意。我應該怎麼使用'htonl'?
7
A
回答
8
的standard標題是:
#include <arpa/inet.h>
你不必擔心在頭文件中定義其他的東西。它不會影響您的編譯代碼,並且對編譯時間應該只有很小的影響。
編輯:你可以測試這個。創建兩個文件,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);
}
和htonl_include.c:
// portable
#include <arpa/inet.h>
#include <stdio.h>
int main()
{
int x = 1;
x = htonl(x);
printf("%d\n", x);
}
在-O1組裝它們,然後走差異:
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
對我來說,唯一的區別是文件名。
0
如果您不想包含與網絡相關的任何內容,則自行聲明htonl
是完全有效的。只是#include <stdint.h>
得到uint32_t
和使用下面的原型:
uint32_t htonl(uint32_t);
參考:POSIX:http://www.opengroup.org/onlinepubs/9699919799/functions/htonl.html
你也可以實現自己的使用工會檢測字節順序(在編譯時)。這不需要任何奇怪的ENDIAN宏或#ifdefs。
相關問題
- 1. 我應該怎麼辦使用LongTouchListener
- 2. 我應該怎麼做?
- 3. 我該怎麼辦用C
- 4. 我該怎麼辦?
- 5. 我該怎麼做?
- 6. 我應該怎樣使用g_strncasecmp的instread?
- 7. 我應該怎樣使用IEnumerable或IList?
- 8. jquery-我應該怎麼提取的HREF
- 9. 我應該怎麼做一個聚合?
- 10. PDO我應該怎麼把文件
- 11. 這是我應該怎麼域類
- 12. (mongo)ID數組:我應該怎麼做?
- 13. 我應該怎麼做GWT使用<th>而不是?
- 14. 使用套接字的C#代理,我應該怎麼做?
- 15. AppEngine id/key/from_path相當混亂我應該怎麼使用
- 16. 對於使用stimulsoft的繁重報告,我應該怎麼做?
- 17. 我應該能夠使用NSTimer延遲2秒。怎麼做?
- 18. 爲什麼我應該使用單獨的測試目標來運行XCTests,我應該怎麼做?
- 19. 爲什麼我應該使用單獨的測試主機來運行XCTests,我應該怎麼做?
- 20. netbeans應該怎麼做?
- 21. Ignited-Datatables,應該怎麼做?
- 22. TFS:我應該怎麼做在應用程序的DLL檢查?
- 23. 我想現在開發metro應用程序。我該怎麼辦?
- 24. Windows 7阻止了我的應用程序。我該怎麼辦?
- 25. 我該怎麼辦在PHP
- 26. 我該怎麼做MongoDB中
- 27. 我該怎麼辦日期
- 28. GWT JDBC我該怎麼辦?
- 29. 我該怎麼做PyQt4?
- 30. 我該怎麼研究?
謝謝!我不知道它不會改變編譯後的代碼。在您回答之前,我正在考慮編寫自己的版本,以便我的代碼可以保持較小。 – Adrian 2010-07-04 03:46:44