我想在我的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. 我應該怎麼做?
- 4. 我該怎麼辦用C
- 5. 在angular2我該怎麼辦使用ngModel
- 6. 我該怎麼辦?
- 7. 我該怎麼做?
- 8. 我該怎麼做?
- 9. 我應該怎樣使用g_strncasecmp的instread?
- 10. 我應該怎樣使用IEnumerable或IList?
- 11. 我應該怎麼做來處理WebServiceException:
- 12. PDO我應該怎麼把文件
- 13. C++ 11/Auto - 我應該怎麼做?
- 14. (mongo)ID數組:我應該怎麼做?
- 15. 我應該怎麼做一個聚合?
- 16. jquery-我應該怎麼提取的HREF
- 17. 這是我應該怎麼域類
- 18. 對於使用stimulsoft的繁重報告,我應該怎麼做?
- 19. 我應該怎麼做才能在java中使用ELement類
- 20. 我應該能夠使用NSTimer延遲2秒。怎麼做?
- 21. 我應該怎麼做GWT使用<th>而不是?
- 22. 使用套接字的C#代理,我應該怎麼做?
- 23. AppEngine id/key/from_path相當混亂我應該怎麼使用
- 24. 片段 - 我應該在onCreateView中重用視圖,我應該怎麼做?
- 25. 我應該依賴注入嗎?我該怎麼做?
- 26. 爲什麼我應該使用單獨的測試主機來運行XCTests,我應該怎麼做?
- 27. 爲什麼我應該使用單獨的測試目標來運行XCTests,我應該怎麼做?
- 28. Ignited-Datatables,應該怎麼做?
- 29. netbeans應該怎麼做?
- 30. TFS:我應該怎麼做在應用程序的DLL檢查?
謝謝!我不知道它不會改變編譯後的代碼。在您回答之前,我正在考慮編寫自己的版本,以便我的代碼可以保持較小。 – Adrian 2010-07-04 03:46:44