2012-09-17 8 views
31

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

मैंने ओएस एक्स पर कुछ परीक्षण किया, और नवीनतम जीसीसी जो डेवलपर टूल के साथ जहाज सी + 11 मोड का समर्थन नहीं करता है (और इसलिए long long की उपलब्धता की गारंटी नहीं है)। क्लेंग इसका समर्थन नहीं करता है, या तो यह एक निश्चित संस्करण के बाद, C99 मोड सक्षम होने पर long long का समर्थन करता है।

के स्थान पर int64_t का उपयोग करने के लिए सामान्य सुझाव है, जब पोर्टेबिलिटी एक महत्वपूर्ण लक्ष्य है? प्रारूप विनिर्देशकों का उपयोग दर्दनाक लगता है।

मैं मज़बूती से एक int64_tlong long करने के लिए (और इसी तरह unsigneduint64_t साथ बराबर करने के लिए) मौजूदा कार्य करता है और पुस्तकालयों कि long long पैरामीटर के रूप में लेने के साथ इसका इस्तेमाल करने डाली कर सकते हैं? (और फिर से, फिर से।)

दिमाग के उस फ्रेम में, यदि मैं कोड भेजता हूं जिसके लिए क्लैंक कार्यक्षमता जीसीसी में नहीं है, तो क्या क्लैंग जीसीसी को लिनक्स पर पसंद के कंपाइलर के रूप में बदलने जा रहा है? क्या वह कंपाइलर कुछ है जो मैं उम्मीद कर सकता हूं, अधिकांश भाग के लिए, उपयोगकर्ताओं को समाप्त करने के लिए स्रोत कोड की पेशकश करते समय?

असल में, मैं उन अन्य डेवलपर्स से कुछ सलाह मांगना चाहता हूं जिन्होंने पोर्टेबल सी और सी ++ कोड के लिए दोनों प्रकार का उपयोग किया है, जिनके पास कुछ सुझाव हो सकते हैं कि जाने के लिए बेहतर दीर्घकालिक तरीका क्या हो सकता है दिमाग में लक्ष्य से ऊपर।

+0

जीसीसी में सी ++ 11 से पहले विस्तार के रूप में 'लंबा लंबा' था, इसलिए जब तक आप जीसीसी-एक्सटेंशन को अक्षम नहीं करते हैं, तो आपको जीसीसी पर 'लंबे समय तक' का उपयोग करने के साथ ठीक होना चाहिए (वास्तव में मुझे नहीं लगता मैंने एक कंपाइलर का उपयोग/देखा है जो लंबे समय तक लंबे समय तक नहीं पेश करता है)। – Grizzly

+0

ध्यान दें कि 'int64_t' में अंतर्निहित प्रकार' लंबा 'या' लंबा लंबा 'हो सकता है, जो ओवरलोडिंग की आवश्यकता होने पर पोर्टेबिलिटी समस्याओं का कारण बन सकता है। –

+0

प्लेटफ़ॉर्म से प्लेटफ़ॉर्म तक आसान परिवर्तन करने के लिए टाइपपीफ पर भी विचार करें। – imallett

उत्तर

26

long long और unsigned long long मानक सी और मानक सी ++ प्रकार प्रत्येक कम से कम 64 बिट्स के साथ हैं। सभी कंपाइलर्स मुझे इन प्रकारों को प्रदान करने के बारे में पता है, संभवत: -pedantic मोड में, लेकिन इस मामले में int64_t या uint64_t प्री-सी ++ 2011 कंपाइलर्स के साथ उपलब्ध नहीं होगा। सभी सिस्टम <stdint.h> पर भी उपलब्ध है। यही वह जगह है, जहां तक ​​मैं इसे बता सकता हूं इससे कोई फर्क नहीं पड़ता कि आप किस प्रकार वर्तनी करते हैं। <stdint.h> का मुख्य लक्ष्य बिट्स की विशिष्ट संख्या के लिए सर्वश्रेष्ठ मिलान प्रदान करना है। यदि आपको कम से कम 64 बिट की आवश्यकता है लेकिन आप इस प्रकार के उपवास के कार्यान्वयन का भी लाभ लेना चाहते हैं, तो आप int_least64_t या uint_least64_t<stdint.h> या <cstdint> से उपयोग करेंगे (बाद के मामले में, नाम नामस्थान std में परिभाषित किए गए हैं)।

+0

मुझे यकीन है कि मानक को 128 या उससे अधिक के रूप में जोड़ने के लिए मानक पसंद है, इस पर ध्यान दें कि इस दिन क्रिप्टोग्राफ़ी का बहुत उपयोग किया जाता है, आपको ऐसे प्रकार की आवश्यकता होती है, इसलिए आपको कई पुस्तकालयों पर भरोसा करते हैं। – farmdve

+0

मैंने इस तरह के एक प्रकार ('लंबे समय तक लंबा') के लिए प्रस्ताव नहीं देखा है, हालांकि मुझे पता है कि कई सिस्टम वास्तव में सिम समर्थन के जरिए 128 बिट प्रकारों का समर्थन करते हैं: WG14 और/या WG21 को एक प्रस्ताव भेजें! –

+2

'लंबा लंबा लंबा' आवश्यक नहीं है; एक प्रणाली जो 128-बिट पूर्णांक का समर्थन करती है * विस्तारित पूर्णांक प्रकार * को परिभाषित कर सकती है और उन प्रकारों के संदर्भ में 'int128_t' और' uint128_t' परिभाषित कर सकती है। –

23

के स्थान पर int64_t का उपयोग करने के लिए सामान्य सुझाव है, जब पोर्टेबिलिटी एक महत्वपूर्ण लक्ष्य है?

यदि कोई संकलक int64_t पेश करता है लेकिन long long नहीं है तो मुझे आश्चर्य होगा।

यदि long long मौजूद है, तो इसमें कम से कम 64 बिट्स होनी चाहिए, इसलिए (u)int64_t से (unsigned) long long का कास्टिंग मूल्य-संरक्षण है।

आप के साथ एक प्रकार की जरूरत है वास्तव में 64 बिट्स, (u)int64_t का उपयोग करें, यदि आप की जरूरत कम से कम 64 बिट्स, (unsigned) long long रूप (u)int_least64_t होगा, बिल्कुल ठीक है।

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