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
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
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.
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