2010-07-04 33 views
7

Tôi muốn sử dụng chức năng htonl trong tiện ích mở rộng ruby ​​c của mình, nhưng không muốn sử dụng bất kỳ nội dung nào khác trên internet đi kèm với nó. Điều gì sẽ là tập tin tối giản nhất để #include vẫn còn di động? Nhìn qua các tệp tiêu đề trên máy tính của tôi, tôi có thể thấy rằng machine/endian.h hoặc sys/_endian.h sẽ cho phép tôi sử dụng chúng, mặc dù tôi không chắc đó có phải là một ý tưởng hay hay không.Tôi nên # bao gồm để sử dụng 'htonl'?

Trả lời

8

Tiêu đề standard là:

#include <arpa/inet.h> 

Bạn không cần phải lo lắng về những thứ khác quy định tại tiêu đề đó. Nó sẽ không ảnh hưởng đến mã được biên dịch của bạn và chỉ nên có một hiệu ứng nhỏ trong thời gian biên dịch.

EDIT: Bạn có thể kiểm tra điều này. Tạo hai tập tin, 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); 
} 

và htonl_include.c:

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

Lắp ráp chúng tại -O1, sau đó đi sự khác biệt:

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 

Đối với tôi, sự khác biệt duy là tên tệp.

+0

Cảm ơn! Tôi không biết rằng nó sẽ không thay đổi mã được biên dịch. Trước khi bạn trả lời, tôi đã xem xét việc viết phiên bản của riêng mình để mã của tôi có thể ở mức nhỏ. – Adrian

0

Nếu bạn không muốn bao gồm bất kỳ điều gì liên quan đến mạng, bạn hoàn toàn tự khai báo số htonl. Chỉ cần #include <stdint.h> để có được uint32_t và sử dụng nguyên mẫu sau:

uint32_t htonl(uint32_t);

tham khảo: POSIX: http://www.opengroup.org/onlinepubs/9699919799/functions/htonl.html

Bạn cũng có thể chỉ thực hiện riêng của bạn bằng cách tự kiểm tra byte (tại compiletime) sử dụng các công đoàn. Điều này không yêu cầu bất kỳ macro ENDIAN lẻ hoặC#ifdefs nào.

Các vấn đề liên quan