2010-07-04 45 views
7

我想在我的ruby c擴展中使用htonl函數,但不想使用隨附的任何其他Internet工具。 #include最簡約的文件是什麼?通過我的電腦上的頭文件,我可以看到machine/endian.hsys/_endian.h會讓我使用它們,但我不確定這是否是一個好主意。我應該怎麼使用'htonl'?

回答

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

謝謝!我不知道它不會改變編譯後的代碼。在您回答之前,我正在考慮編寫自己的版本,以便我的代碼可以保持較小。 – Adrian 2010-07-04 03:46:44

0

如果您不想包含與網絡相關的任何內容,則自行聲明htonl是完全有效的。只是#include <stdint.h>得到uint32_t和使用下面的原型:

uint32_t htonl(uint32_t);

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

你也可以實現自己的使用工會檢測字節順序(在編譯時)。這不需要任何奇怪的ENDIAN宏或#ifdefs。