2010-07-04 13 views
7

मैं अपने रूबी सी एक्सटेंशन में htonl फ़ंक्शन का उपयोग करना चाहता हूं, लेकिन इसके साथ आने वाली किसी अन्य इंटरनेट सामग्री का उपयोग नहीं करना चाहता हूं। #include पर सबसे सरल फ़ाइल क्या होगी जो अभी भी पोर्टेबल है? मेरे कंप्यूटर पर हेडर फाइलों को देखकर, मैं देख सकता हूं कि machine/endian.h या sys/_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

0

यदि आप नेटवर्क से संबंधित कुछ भी शामिल नहीं करना चाहते हैं, तो यह htonl स्वयं घोषित करने के लिए पूरी तरह से मान्य है। बस #include <stdint.h>uint32_t हो और निम्न प्रोटोटाइप उपयोग करने के लिए:

uint32_t htonl(uint32_t);

संदर्भ: POSIX: http://www.opengroup.org/onlinepubs/9699919799/functions/htonl.html

आप, साथ ही परीक्षण बाइट क्रम (compiletime पर) यूनियनों का उपयोग करके अपने खुद के लागू कर सकते हैं। इसके लिए किसी भी विषम अंत मैक्रोज़ या #ifdefs की आवश्यकता नहीं है।