2010-11-02 6 views
6

एक पुस्तकालय है जिसे मैं विभिन्न 32-बिट प्लेटफार्मों के खिलाफ बनाता हूं। अब, 64-बिट आर्किटेक्चर समर्थित होना चाहिए। 64-बिट आर्किटेक्चर का समर्थन करने के लिए मौजूदा 32-बिट कोड को विस्तारित करने के लिए सबसे सामान्य रणनीतियां क्या हैं? क्या मुझे # ifdef या कुछ और उपयोग करना चाहिए?मौजूदा 32 बिट कोड में 64 बिट समर्थन जोड़ना मुश्किल है?

उत्तर

16

शामिल प्रयासों की मात्रा पूरी तरह से इस बात पर निर्भर करेगी कि मूल कोड कितना अच्छी तरह लिखा गया है। सबसे अच्छे मामले में पुन: संकलन के अलावा कोई प्रयास शामिल नहीं होगा। सबसे बुरे मामले में आपको अपना कोड "64 बिट क्लीन" बनाने में बहुत समय व्यतीत करना होगा।

विशिष्ट समस्याएं हैं:

  • पूर्णांक/लंबे/सूचक के आकार के बारे में मान्यताओं/आदि
  • बताए संकेत < => ints
  • डिफ़ॉल्ट तर्क या समारोह परिणाम रूपांतरण (यानी कोई समारोह प्रोटोटाइप पर भरोसा)
  • अनुचित प्रिंटफ़/स्कैनफ़ प्रारूप विनिर्देश
  • structs के आकार/संरेखण/पैडिंग के बारे में धारणाएं (विशेष रूप से फ़ाइल या नेटवर्क I/O के संबंध में) , या अन्य API के साथ आदि इंटरफ़ेस,)
  • अनुचित डाले जब बाइट ऑफसेट
+5

+1 बस कुछ जोड़: पूर्णांक तर्कों के लिए एक बुरा मामला va_arg फ़ंक्शंस हैं: सभी संकीर्ण पूर्णांक प्रकार जो '...' से मेल खाते हैं, उन्हें 'int' में बढ़ावा दिया जाएगा। फिर, कोड जो 'size_t', 'uintptr_t',' ptrdiff_t', 'utr64_t' जैसे सही अर्थशास्त्र के साथ पूर्णांक' टाइपोफ़ 'का उपयोग करता है, आमतौर पर संकलित और चलाएगा। कोड जो लूप चर के रूप में हर जगह 'int' के लिए दुर्व्यवहार करता है, 'char' अंकगणित भूल जाता है कि यह हस्ताक्षरित या हस्ताक्षरित हो सकता है, और ऐसी चीजें परेशानी की तलाश में हैं। सभी कंट्रोलरों के साथ अपने कोड को विभिन्न चेतावनियों के साथ चलाएं, 'क्लैंग' 'gcc' –

+0

@Jens के लिए एक अच्छा पूरक है: अतिरिक्त टिप्पणियों के लिए धन्यवाद - एकाधिक कंपाइलरों के साथ भवन और परीक्षण के बारे में बिंदु बहुत अच्छा है। –

1

बस मशीन शब्द के आकार की धारणा पर भरोसा न करें? हमेशा sizeof, stdint.h, आदि का उपयोग करें। जब तक कि आप अलग-अलग आर्किटेक्चर के लिए अलग-अलग लाइब्रेरी कॉल पर भरोसा न करें, #ifdefs की आवश्यकता नहीं होनी चाहिए।

-1

सबसे आसान रणनीति क्या आप 64-बिट सेटिंग्स के साथ है का निर्माण और इसे से बाहर बिल्ली का परीक्षण करने के लिए है के साथ सूचक अंकगणित कर। कुछ कोड को बदलने की जरूरत नहीं है। अन्य कोड, आमतौर पर इंक/पॉइंटर्स के आकार के बारे में गलत धारणाओं के साथ और अधिक भंगुर हो जाएगा और आर्किटेक्चर पर निर्भर नहीं होने के लिए संशोधित करने की आवश्यकता होगी।

बाइनरी रिकॉर्ड वाले अक्सर बाइनरी फाइलें सबसे अधिक समस्याएं पैदा करती हैं। यह उन वातावरणों में विशेष रूप से सच है जहां संक्रमण 64-बिट निर्माण में संक्रमण में 32-बिट से 64-बिट तक बढ़ता है। मुख्य रूप से यह इस तथ्य के कारण होता है कि पूर्णांक फ़ाइलों को अपनी वर्तमान (32-बिट) लंबाई में मूल रूप से लिखा जाता है और 64-बिट बिल्ड में गलत लंबाई का उपयोग करने में पढ़ा जाता है जहां इन्ट्स 64-बिट होते हैं।

+1

यह निश्चित रूप से कंपाइलर पर निर्भर करता है, लेकिन मैंने उपयोग किए गए सभी 64 बिट सी कंपाइलर्स (जीसीसी, क्लैंग), 32 बिट्स पर 'int' छोड़ दें और' बिट '64 बिट्स बनाते हैं। – JeremyP

+1

@ जेरेमीपी: यह संकलक के बजाय प्लेटफ़ॉर्म डेटा मॉडल (http://en.wikipedia.org/wiki/64-bit#Specific_C-language_data_models) पर निर्भर करता है। उदाहरण के लिए Win64 पर 'int' और' long' दोनों 32 बिट रहते हैं, जबकि 'लंबा लंबा' 64 बिट होता है, इसलिए मॉडल पूर्णांक के लिए Win32 के समान होता है, लेकिन पॉइंटर्स 64 बिट बन जाते हैं, इसलिए कोड जो 'int' का उपयोग करने का प्रयास करता है या पॉइंटर मान को पकड़ने के लिए 'लंबा' असफल हो जाएगा - जहां आवश्यक हो वहां 'intptr_t' में बदलें। – Clifford

संबंधित मुद्दे