2009-09-11 8 views
18

क्या आप t_byte* (typedef unsigned char t_byte के साथ) या unsigned char* पर कुछ कोड देखना पसंद करते हैं?सर्वोत्तम व्यवहार: क्या मुझे सी या सी ++ में बाइट के लिए टाइपिफ़ बनाना चाहिए?

मैं अपने पुस्तकालयों में t_byte की ओर झुका रहा हूं, लेकिन इस दृष्टिकोण को कभी भी नहीं लिया गया है, और इस समस्या को लेकर मुझे आश्चर्य हुआ है।

उत्तर

21

यदि आप सी 99 या नए का उपयोग कर रहे हैं, तो आपको इसके लिए stdint.h का उपयोग करना चाहिए। इस मामले में uint8_t

सी ++ को इस हेडर को सी ++ 11 तक नहीं मिला, इसे cstdint पर कॉल किया गया। विजुअल सी ++ के पुराने संस्करणों ने आपको C++ कोड में C99 के stdint.h का उपयोग करने की अनुमति नहीं दी, लेकिन बहुत से अन्य C++ 98 कंपाइलर ने बहुत कुछ किया, इसलिए पुराने कंपेलरों का उपयोग करते समय भी आपके पास यह विकल्प हो सकता है।

बहुत से अन्य बातों के अलावा, Boost कागजात इस अंतर को खत्म हो boost/integer.hpp में, uint8_t तरह बातें प्रदान करता है, तो अपने संकलक के मानक सी ++ पुस्तकालय नहीं है के साथ होता है।

2

व्यक्तिगत रूप से मैं boost::int8_t और boost::uint8_t पसंद करता हूं।

यदि आप बूस्ट का उपयोग नहीं करना चाहते हैं तो आप boost\cstdint.hpp उधार ले सकते हैं।

एक और विकल्प portable version of stdint.h (this उत्तर से लिंक) का उपयोग करना है।

+9

मैं वास्तव में टाइपपीफ के लिए बूस्ट हेडर की आवश्यकता पर बेचा नहीं जाता हूं। –

+0

ध्यान दें कि जबकि stdint.h को C99 द्वारा परिभाषित किया गया है, वर्तमान आईएसओ सी ++ मानक (क्योंकि यह सी 99 की भविष्यवाणी करता है) द्वारा आवश्यक है, इसलिए आप कुछ कंपाइलर्स में पा सकते हैं जिन्हें आपको हेडर नामों के लिए सी सम्मेलन का उपयोग करना है, स्टडींट का उपयोग करना है प्रकार, और यह सबसे पोर्टेबल रूप होगा। – Clifford

1

आपके अजीब नामकरण सम्मेलन के अलावा, मुझे लगता है कि यह ठीक हो सकता है। आप के लिए यह करता है मन को बढ़ावा देने में रखें, पार मंच-क्षमता के साथ मदद करने के लिए:

#include <boost/integer.hpp> 

typedef boost::uint8_t byte_t; 

ध्यान दें कि आमतौर पर टाइप की byte_t के रूप में, _t साथ प्रत्यय कर रहे हैं।

+0

आपके द्वारा परिभाषित किए जाने वाले प्रकारों को "_t" से प्रत्यय नहीं किया जाना चाहिए क्योंकि इस तरह के नाम भाषा और मानक पुस्तकालयों के एक्सटेंशन के लिए आरक्षित हैं (उदाहरण के लिए कि uint8_t जोड़ना मौजूदा कोड को तोड़ नहीं देता है)। – Dipstick

+0

@chrisharris आपको यह जानकारी कहाँ मिली? मैं आईएसओ सी ++ मानकों के मसौदे को देख रहा हूं और उस अनुभाग को नहीं ढूंढ सकता, लेकिन मेरे पास एक सहकर्मी है जो अपने सभी वर्ग/फ़ंक्शन टेम्पलेट्स को इस तरह से प्रत्ययित करना पसंद करता है और उसे इंगित करना चाहता हूं। – stinky472

+0

@ stinky472: मुझे नहीं पता कि आईएसओ सी मानक इस बारे में क्या कहता है, लेकिन सामान्य ज्ञान कहता है कि कस्टम नाम मानक वाले लोगों के साथ टकराव नहीं करना चाहिए, इसलिए परेशानी से बचने के लिए 'बाइट' का उपयोग करना बेहतर होता है। या, यदि आपका सहकर्मी पसंद करता है, तो प्रत्यय के बजाय * उपसर्ग * का उपयोग करें: 't_byte'। – MestreLion

7

मेरा सुझाव है कि यह इस तरह uint8_t और int8_t रूप C99<stdint.h> हैडर प्रकार का उपयोग अपने संकलक का समर्थन करता है।

यदि आपका कंपाइलर इसका समर्थन नहीं करता है, तो एक बनाएं। Here'sवीसी ++ के लिए एक उदाहरण, जिसमें पुराने संस्करण stdint.h नहीं हैं। जीसीसीstdint.h वास्तव में की अपने सुझाव के साथ C99

एक समस्या यह है सबसे कि char के हस्ताक्षर, कार्यान्वयन परिभाषित किया गया है, इसलिए यदि आप एक प्रकार उर्फ ​​बना सकता है का समर्थन करता है, और। आपको कम से कम संकेत के बारे में स्पष्ट होना चाहिए। इस विचार में कुछ योग्यता है क्योंकि सी # उदाहरण के लिए char 16 बिट है। लेकिन इसमें एक बाइट प्रकार भी है।


अतिरिक्त नोट ...

अपने सुझाव के साथ कोई समस्या नहीं था, तो आप वास्तव में अहस्ताक्षरित निर्दिष्ट किया था।

मैं यह भी सुझाव दूंगा कि सादा char का उपयोग किया जाता है यदि डेटा वास्तव में चरित्र डेटा है, यानी सादा पाठ का प्रतिनिधित्व है जैसे कि आप कंसोल पर प्रदर्शित हो सकते हैं।मानक और तृतीय-पक्ष पुस्तकालयों का उपयोग करते समय यह कम प्रकार की समझौते की समस्याएं पेश करेगा। यदि दूसरी ओर डेटा बिट-अप जैसी गैर-वर्ण इकाई का प्रतिनिधित्व करता है, या यदि यह संख्यात्मक 'छोटा पूर्णांक' डेटा है जिस पर आप अंकगणितीय हेरफेर कर सकते हैं, या डेटा जो आप लॉजिकल ऑपरेशंस करेंगे, तो उनमें से एक stdint.h प्रकार (या उनमें से एक से परिभाषित एक प्रकार) का उपयोग किया जाना चाहिए।

मैं हाल ही में एक TI C54xx संकलक जहां char तथ्य 16bit में है पर बाहर पकड़ा गया, कि इतने क्यों stdint.h जहां संभव हो उपयोग कर रहा है, भले ही आप इसका इस्तेमाल करते हैं तो परिभाषित करने के लिए एक byte प्रकार बेहतर है यह मानते हुए कि unsigned char एक उपयुक्त उपनाम है।

+0

मेरे उदाहरण के बारे में अच्छा बिंदु, मैंने वॉरेन के जवाब को सही बताया क्योंकि वह पहले थे और उनकी पोस्ट संक्षिप्त थी। कम से कम आप को ऊपर उठाया ... –

0

मैं मानक प्रकार, हस्ताक्षरित चार, uint8_t, आदि का उपयोग करना पसंद करता हूं, इसलिए किसी भी प्रोग्रामर को स्रोत को देखने के लिए कोड को ग्रोक करने के लिए हेडर को वापस संदर्भित नहीं करना पड़ता है। जितनी अधिक टाइपिफ आप दूसरों को अपने टाइपिंग सम्मेलनों को जानने के लिए अधिक समय लेते हैं। संरचनाओं के लिए, पूरी तरह से टाइपपीफ का उपयोग करें, लेकिन प्राइमेटिव्स के लिए उन्हें कम से कम उपयोग करें।

4

मैं इसमें संग्रहीत मूल्यों के अर्थ को व्यक्त करने के लिए प्रकारों को पसंद करता हूं। अगर मुझे अपनी मशीन पर एक बाइट का वर्णन करने के प्रकार की आवश्यकता है, तो मैं byte_tunsigned char से अधिक पसंद करता हूं, जिसका अर्थ केवल कुछ भी हो सकता है। (मैं एक कोड बेस में काम कर रहा हूं जो यूटीएफ -8 तारों को स्टोर करने के लिए signed char या unsigned char का उपयोग करता है।) यह uint8_t के लिए जाता है। इसका उपयोग केवल उस के रूप में किया जा सकता है: एक 8 बिट हस्ताक्षरित पूर्णांक।

byte_t (जैसा कि किसी अन्य उपयुक्त नाम के साथ) के साथ, शायद ही कभी इसे परिभाषित करने की आवश्यकता है (और यदि ऐसा है, तो एक अच्छा संपादक आपके लिए इसे देखने के लिए 3secs ले जाएगा; शायद 10secs , यदि कोड बेस विशाल है), और बस इसे देखकर यह स्पष्ट है कि उस प्रकार की वस्तुओं में क्या संग्रहीत किया जाता है।

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