2010-10-25 8 views
13

मैं कभी-कभी खुले स्रोत सी ++ लाइब्रेरी में 64 बिट अंकगणित का उपयोग करता हूं। मैंने पाया कि long long मेरे उद्देश्य को काफी अच्छी तरह से सेवा प्रदान करता है। यहां तक ​​कि कुछ 10 साल पुराने सौर बॉक्स भी संकलित कर सकते हैं। और यह विंडोज़ पर # डिफाईन्स के साथ गड़बड़ किए बिना काम करता है।पोर्टेबल 64 बिट अंकगणित कैसे करें, संकलक चेतावनियों के बिना

अब मुद्दा यह है कि मुझे अपने उपयोगकर्ताओं से शिकायतें मिलती हैं क्योंकि वे जीसीसी-आधारित सेटिंग्स के साथ संकलित होते हैं, और जीसीसी चेतावनी जारी करने पर जोर देती है कि long long सी ++ मानक का हिस्सा नहीं है। यह शायद सही है, लेकिन मुझे सी ++ मानक प्रति से ज्यादा दिलचस्पी नहीं है, मैं बस अपने कोड को जितना संभव हो उतने कंपाइलर्स पर काम करना चाहता हूं।

तो मेरे सवाल दोहरा है:

  • किसी को भी वास्तविक सी ++ compilers कि 64 बिट लंबे का समर्थन नहीं करते नाम कर सकते हैं?
  • क्या संकलक चेतावनी के बिना जीसीसी संकलन 64 बिट अंकगणित (32 बिट प्लेटफ़ॉर्म पर) बनाने का कोई तरीका है? (stdint.h मदद नहीं करता है, क्योंकि यह long long पर भी निर्भर करता है)

पीएस

यदि ऐसे प्लेटफॉर्म हैं जहां लंबे समय तक 128 बिट या बड़ा हो जाता है, तो यह दिलचस्प है, लेकिन मेरे लिए कोई समस्या नहीं है।

+5

का उपयोग करना * * काम * प्राप्त करने का कोई अच्छा तरीका है और किसी भी अच्छे कारण के लिए अधिकांश तृतीय-पक्ष पुस्तकालयों के उपयोग को रोकना नहीं है। टिन पर यह कहता है - एक व्यर्थ शिकायत, लेकिन मुझे नहीं लगता कि आपके उपयोगकर्ताओं को इतनी मूर्खतापूर्ण होने से रोकने के लिए कहें कि आप उन्हें भी प्यार करेंगे !? – Clifford

+11

@ क्लाइफोर्ड: '-pedantic' कोड लिखने में आपकी मदद करने के लिए है जो भविष्य में अन्य कंपाइलर्स को पोर्ट करना आसान होगा। यदि आप इसके बारे में चिंतित नहीं हैं, तो आपको इसका उपयोग करने की ज़रूरत नहीं है, लेकिन आप उस व्यक्ति के रूप में समाप्त हो जाएंगे जो उन सभी तृतीय पक्ष पुस्तकालयों को लिख रहा है जो (ए) अजीब चेतावनियां उत्पन्न करते हैं, और (बी) काफी संभवतः डॉन ' कुछ compilers पर काम नहीं करते हैं। अनुमोदित, 'लंबे समय तक' सबसे संभावित वास्तविक समस्या नहीं है, लेकिन मैं एक पोर्टेबल उत्पाद पर काम करता था और कई बार हमने उन विंडोज लड़कों से सामान तय किया जो वास्तव में हमारे कुछ प्लेटफॉर्म पर काम नहीं करते थे (और जीसीसी-पैडेंटिक उन्हें ऐसा कहा होगा)। –

+0

... आश्चर्यजनक रूप से पर्याप्त, जब लिनक्स प्रोग्रामर उत्पाद के पोर्टेबल घटक पर काम कर रहे थे, तो उनके कोड अन्य प्लेटफार्मों पर परीक्षण विफल होने की संभावना कम थी। –

उत्तर

15

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

मुझे लगता है कि आप "डेफिन के साथ गड़बड़ाना" कहते हैं, लेकिन मुझे नहीं लगता कि इसमें बहुत अधिक गलत है। आप एक डिफ़ॉल्ट संस्करण प्रदान कर सकते हैं जो सीधे long long का उपयोग करता है और आपके 10-वर्षीय सोलारिस बॉक्स और विंडोज़ पर भी काम करेगा, इसलिए अधिकांश उपयोगकर्ताओं को कभी भी आपकी लाइब्रेरी के उपयोगकर्ता-कॉन्फ़िगर करने योग्य भाग के पास जाने की आवश्यकता नहीं होगी।

फिर पैडेंटिक उपयोगकर्ताओं के लिए, आप जीसीसी के लिए एक संस्करण प्रदान कर सकते हैं जिसमें <sys/types.h> शामिल है और long long के बजाय int64_t का उपयोग करता है। यह g++ -pedantic के साथ मेरे लिए कोई चेतावनी नहीं उकसाता है।आप इसे जीसीसी को पहचानकर डिफ़ॉल्ट संस्करण में भी कर सकते हैं, जो निश्चित रूप से # डिफाइन के साथ गड़बड़ कर रहा है, लेकिन फिर से ऐसा नहीं है जो बहु-प्लेटफ़ॉर्म उत्पाद के लिए बिल्कुल असामान्य है।

यदि आपकी लाइब्रेरी को कुछ प्लेटफ़ॉर्म के लिए बाइनरी के रूप में भी प्रदान किया जाता है, तो निश्चित रूप से आपको यह तय करना होगा कि 64 बिट प्रकार क्या होगा। यदि यह लाइब्रेरी इंटरफ़ेस (और इसलिए हेडर फ़ाइल) में भी दिखाई देता है, तो आपको केवल एक चुनना होगा जो उचित संकलक विकल्पों के साथ किसी भी चेतावनी को उत्तेजित नहीं करेगा। मुझे लगता है कि -pedantic एक उचित संकलक विकल्प है, और स्पष्ट रूप से आपके उपयोगकर्ताओं को ऐसा करते हैं, तो फिर से यह जीसीसी पर int64_t है।

+0

+1, मुझे लगता है कि int64_t यहां सबसे अच्छा समाधान है। – rmeador

+0

मेरे पास एक config.h है।कुछ समय पर मैं पहले से ही 'int64_t' (stdint.h से) का उपयोग कर रहा था, लेकिन इसे लंबे समय तक पक्ष में डाला क्योंकि बाद वाला इतना व्यापक समर्थन था। दिलचस्प बात यह है कि 'int64_t' (stdint.h से) काम करता है, भले ही यह' लंबे समय तक '(मेरे सिस्टम पर) के लिए टाइपपीफ है। मुझे मारता है, लेकिन मुझे सही रास्ते पर स्थापित करने के लिए धन्यवाद। –

+0

@jdv: यह उस चीज के कारण है जो शून्य का उल्लेख करता है: जीसीसी का हेडर मेरी मशीन पर '/ usr/include/sys/_types.h' में' __extension__' का उपयोग करता है। –

12

जीसीसी में उस विशेष चेतावनी को दबाने के लिए -Wno-long-long संकलक विकल्प का उपयोग करें।

आप -std=C++0x का भी उपयोग कर सकते हैं, लेकिन शायद पोर्टेबिलिटी को और कम कर देगा।

+0

मुझे उम्मीद है कि इसे कमांड लाइन स्विच के बिना ठीक किया जा सकता है, लेकिन धन्यवाद, वैसे भी। –

4

आप -Wno-long-long के साथ चेतावनी को चुप कर सकते हैं (सुनिश्चित करें कि यह -pedantic के बाद आता है)। सी -9 द्वारा 64-बिट पूर्णांक की आवश्यकता होती है और मुझे लगता है कि सी ++ 0x इतने कंपाइलर्स हैं कि आजकल दुर्लभ नहीं हो रहे हैं।

+0

मुझे नहीं लगता कि सी 99 द्वारा 'लंबे समय तक' समर्थन की आवश्यकता है, लेकिन मुझे लगता है कि इसे सी ++ 0x द्वारा आवश्यक है। – Brian

+0

मैं 100% निश्चित हूं कि यह सी 99 में है, लेकिन मुझे पूरा यकीन है कि यह सी ++ 98 में नहीं है। (उस समय यह एक बड़ा सौदा था, क्योंकि माइक्रोसॉफ्ट ने समिति को "आकार (आकार_टी)> आकार (लंबी)' वैध एबीआई विकल्प के रूप में स्वीकार करने के लिए मजबूर किया, जिसे सी 8 9 का वादा कभी नहीं होगा।) – zwol

+0

मैं तर्क रखूंगा दिमाग में सी 99 के बारे में। –

0

आप अपने सी ++ bigint पुस्तकालयों में से एक के साथ long long के उपयोग को प्रतिस्थापित कर सकते हैं। मुझे यकीन है कि उनमें से कुछ इस कंपाइलर त्रुटि से बचें। व्यक्तिगत रूप से, मैं बजाय त्रुटि के साथ रहना होगा।

3

यदि आप जीसीसी में भेजे गए स्विच को नियंत्रित करने में असमर्थ हैं, तो आप #pragma के साथ चेतावनी को बंद करने में सक्षम हो सकते हैं।

http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html

4

तुम भी जीसीसी के "__extension__" सुविधा, जैसे का उपयोग कर चेतावनी को दबाने कर सकते हैं:

// No '-pedantic' warning/error. 
__extension__ long long foo = 2; 

// Exhibits '-pedantic' warning/error. 
long long bar = 3 

और संकलन:

$ g++ -pedantic -fsyntax-only foo.cpp 
foo.cpp:5: error: ISO C++ 1998 does not support 'long long' 

सूचना है कि केवल long long के अंतिम उपयोग के बाद से -pedantic त्रुटि शुरू हो रहा __extension__ को प्रीपेड किया गया था। भले ही, मैं इसके बजाय int64_t का उपयोग करने के @Steve Jessop's suggestion के साथ जाऊंगा।

1

आप एक प्रणाली में बूस्ट है निर्देशिका में शामिल हैं, तो आप कह सकते हैं

#include "boost/cstdint.hpp" 
boost::int64_t my_64_bit_number; 

यदि यह एक सिस्टम में है निर्देशिका में शामिल हैं, चेतावनी स्वचालित रूप से दबा दिया जाता है।

+1

मैं इस सुझाव का उपयोग नहीं कर रहा हूं, क्योंकि मैं अभी तक बूस्ट का उपयोग नहीं कर रहा हूं। लेकिन धन्यवाद। –