2010-07-04 9 views
7

Ruby C uzantımda htonl işlevini kullanmak istiyorum, ancak onunla birlikte gelen diğer internet öğelerini kullanmak istemiyorum. Hala taşınabilir olan #include için en minimalist dosya ne olurdu? Bilgisayarımdaki başlık dosyalarını incelediğimde, bunun iyi bir fikir olup olmadığından emin olmamama rağmen machine/endian.h veya sys/_endian.h'un bunları kullanmama izin verdiğini görebiliyorum.'htonl' kullanmak için #include kullanmalıyım?

cevap

8

standard başlık budur: O başlığında tanımlanan diğer şeyler hakkında endişelenmenize gerek yok

#include <arpa/inet.h> 

. Derlenmiş kodunuzu etkilemez ve derleme zamanında yalnızca küçük bir etkisi olmalıdır.

DÜZENLEME: Bunu test edebilirsiniz. iki dosya, 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); 
} 

ve htonl_include.c oluşturun: Benim için

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 

, tek fark:

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

sonra almak -O1 de fark bunları birleştirin dosya adıdır. Eğer şey dahil etmek istemiyorsanız

+0

Teşekkürler! Derlenmiş kodu değiştirmeyeceğini bilmiyordum. Cevap vermeden önce, kodumun küçük kalabilmesi için kendi versiyonumu yazmayı düşünüyordum. – Adrian

0

o htonl bunu beyan etmek tamamen geçerli olduğunu, ağa bağlı. Sadece #include <stdint.h>uint32_t almak ve aşağıdaki prototip kullanmak: http://www.opengroup.org/onlinepubs/9699919799/functions/htonl.html

Ayrıca sadece sendikaları kullanarak (compiletime de) test bayt emriyle kendi uygulayabilirsiniz:

uint32_t htonl(uint32_t);

Referans: POSIX. Bu, tek bir ENDIAN makroları veya #ifdefs gerektirmez.