2010-04-25 10 views
5

बूस्ट का सी 99 स्टिंट कार्यान्वयन बहुत आसान है। हालांकि, एक चीज मुझे बग करता है। वे अपने सभी टाइपपीफ को boost namespace में डंप करते हैं। यह मैं तीन विकल्पों के साथ छोड़ देता है जब इस सुविधा का इस्तेमाल:बूस्ट का "cstdint" उपयोग

  1. उपयोग "using namespace boost"
  2. उपयोग "using boost::[u]<type><width>_t"
  3. स्पष्ट रूप boost:: उपसर्ग के साथ लक्ष्य प्रकार का संदर्भ लें; उदाहरण के लिए, boost::uint32_t foo = 0;

  • विकल्प पराजय № 1 तरह नामस्थान की बात। यहां तक ​​कि यदि स्थानीय दायरे के भीतर उपयोग किया जाता है (उदाहरण के लिए, फ़ंक्शन के भीतर), फ़ंक्शन तर्कों जैसी चीजें अभी भी विकल्प की तरह प्रीफिक्स्ड होनी चाहिए № 3.
  • विकल्प № 2 बेहतर है, लेकिन इन प्रकारों का एक गुच्छा है, इसलिए यह प्राप्त हो सकता है शोर।
  • विकल्प № 3 शोर का चरम स्तर जोड़ता है; boost:: उपसर्ग अक्सर प्रश्न के प्रकार की लंबाई के लिए ≥ होता है।

मेरा प्रश्न है: क्या ग्लोबल नेम स्पेस में इन प्रकार के सभी लाने के लिए सबसे खूबसूरत तरीका क्या होगा? क्या मुझे सिर्फ boost/cstdint.hpp के आसपास एक रैपर लिखना चाहिए जो विकल्प № 2 का उपयोग करता है और इसके साथ किया जाता है?


इसके अलावा, शीर्ष लेख लपेटकर की तरह तो कुलपति ++ 10 (मानक पुस्तकालय हेडर के साथ समस्याओं) पर काम नहीं किया:

namespace Foo 
{ 
    #include <boost/cstdint.hpp> 

    namespace boost_alias = boost; 
} 

using namespace Foo::boost_alias; 

संपादित करें: मुझे लगता है कि एक और विकल्प पूर्वप्रक्रमक उपयोग करने के लिए है इसे वीसी 10 पर काम करने के लिए? ऊपर स्निपेट लेना:

#ifndef FOO_HPP_INCLUDED 
#define FOO_HPP_INCLUDED 

#if _MSC_VER >= 1600 /*VC++ 10*/ || defined USE_NATIVE_STDINT_HEADER 
    #include <stdint.h> 
#else 
    namespace cstdint_wrapper 
    { 
    #include <boost/cstdint.hpp> 

    namespace boost_alias = boost; 
    } 

    using namespace cstdint_wrapper::boost_alias; 
#endif 

#endif 

कम काम, मुझे लगता है?

+0

http://stackoverflow.com/questions/1481733/portable-c-03-exact-width-types –

+0

@gf: निफ्टी स्क्रिप्ट, धन्यवाद के संभावित डुप्लिकेट। – patt0h

+0

आपको इन प्रकारों में से * सभी * की आवश्यकता क्यों है? मैं अक्सर उनमें से एक या दो का उपयोग करता हूं, लेकिन मुझे कभी भी उन सभी की आवश्यकता याद नहीं है। – jalf

उत्तर

5

मैं केवल सी 99 के stdint.h का उपयोग करता हूं (यह वास्तव में वीएस 2010 में है)।

  • http://snipplr.com/view/18199/stdinth/
  • : दृश्य C/C++ के संस्करण है कि यह शामिल नहीं है के लिए, मुझे लगता है कि मैं (जब मैं VC6 में काम करने के लिए किया था से) VC6 के साथ काम करने के लिए संशोधित MinGW से एक सार्वजनिक डोमेन संस्करण का उपयोग

जानने के कुछ अन्य विकल्प आप इस अतः प्रश्न में विचार कर सकते हैं: C99 stdint.h header and MS Visual Studio

आप boost/cstdint.hpp का उपयोग जारी रखना चाहते हैं, तो मैं कहता हूँ चाहते हैं कि एक आवरण हैडर कि में प्रकार लाता है को लागू करने के सुझाव वैश्विक नामस्थान जाने का रास्ता होगा।

क्या boost/cstdint.hpp कुछ भी प्रदान करता है जो मुझे पता होना चाहिए कि stdint.h में नहीं है?

+0

पुन: cstdint.hpp बनाम stdint.h - मुझे लगता है कि वे केवल अंतर यह है कि cstdint.hpp 64-बिट प्रकार और संबंधित मैक्रोज़ शामिल हो सकता है या नहीं, क्योंकि लंबे समय तक अभी तक मानक नहीं है। इसके अलावा, मैं बूस्ट के संस्करण का उपयोग करना चाहता था क्योंकि मेरे पास पहले से ही मेरी परियोजना में कई बढ़ावा निर्भरताएं हैं। उस मामले में एक अतिरिक्त शीर्षलेख वितरित करने के लिए समझ में नहीं आया। – patt0h

1

मैं व्यक्तिगत रूप से हमेशा विकल्प 3 का उपयोग करता हूं। यदि चीजें बहुत लंबी हैं, तो आप कोड की मात्रा को कम करने के लिए टाइपपीफ का उपयोग कर सकते हैं।

2

विकल्प 2 लागू करने वाले एक रैपर हेडर लिखने का आपका विचार निश्चित रूप से उन तीन विकल्पों में से बेहतर है।

मैं क्या सुझाव दूंगा, हालांकि, एक मामूली संस्करण है: using अन्य नामस्थान के भीतर घोषणाएं, जैसे कि cstdint या कुछ; तो, आपके पास अपने कोड में using cstdint; डालने या विशेष उपयोगों पर स्पष्ट रूप से cstdint:: निर्दिष्ट करने का विकल्प है।

2

यदि आप सीधे फ़ाइल शामिल करते हैं तो आपको इसे std :: से उपसर्ग करने के लिए मजबूर किया जाएगा। तो सवाल यह है कि आप इस मामले में कौन सा विकल्प लेंगे। बूस्ट द्वारा पेश किए गए अन्य प्रकारों के साथ आप क्या करेंगे? क्या आप उन्हें बूस्ट :: या नहीं के साथ उपसर्ग करेंगे?

मुट्ठी स्पष्ट रूप से एक खराब विकल्प है। आप अपने my_cstdint.hpp फ़ाइल

#include <boost/cstdint.hpp> 

using boost::uint32_t; 
... 

का उपयोग कर विकल्प दो को लागू करने और अपने आवेदन में my_cstdint.hpp शामिल कर सकते हैं। लेकिन मेरी राय में रूट नेमस्पेस पर नए प्रतीकों को जोड़ना एक बुरा विचार है, आप अधिक विवाद प्राप्त कर सकते हैं क्योंकि प्रकार पहले से ही परिभाषित किए जा सकते हैं उदाहरण के लिए stdint.h सी फ़ाइल।

भले ही तीसरा विकल्प बहुत सारे पात्रों का उपयोग करता है, इस उद्देश्य के लिए नामस्थान हैं। boost :: uint32_t को आपके टूलसेट के आधार पर सही प्रकार के लिए परिभाषित किया जाएगा, इसलिए बस इसका उपयोग करें, क्योंकि आप std :: uint32_t का उपयोग करेंगे।

+0

लेकिन आप यह कर सकते हैं और रूट के बजाए अपने प्रोजेक्ट के नेमस्पेस में उपयोग घोषणाएं जोड़ सकते हैं। (हर कोई एक प्रोजेक्ट-विशिष्ट नेमस्पेस का उपयोग करता है, है ना? अगर आप नहीं करते हैं, तो आपको शायद रूट नेमस्पेस को प्रदूषित करने की परवाह नहीं है।) –