अगर निश्चित चौड़ाई पूर्णांक परिभाषित किए गए हैं तो कैसे जांचें


25

C ++ में, निश्चित चौड़ाई पूर्णांक को वैकल्पिक के रूप में परिभाषित किया गया है , लेकिन मुझे यह जांचने के लिए अनुशंसित तरीका नहीं मिल रहा है कि क्या वे वास्तव में परिभाषित हैं।

यदि निश्चित चौड़ाई पूर्णांक उपलब्ध हैं, तो यह जांचने का एक पोर्टेबल तरीका क्या होगा?


लगता है कि फीचर टेस्ट मैक्रो नहीं है , लेकिन मुझे लगता है कि आप कर सकते हैं#if defined(INT8_MIN)
ज़ेरेगेस

2
यदि एसटीडी लाइब्रेरी उसके लिए एक सुविधा परीक्षण मैक्रो प्रदान नहीं करता है, तो आप जांच सकते हैं कि क्या आपके द्वारा उपयोग किया जाने वाला टूलचैन इसके लिए एक प्रदान करता है या आपको स्वयं के परीक्षण को परिभाषित करने की अनुमति देता है। उदाहरण के लिए, सीएमके आपको एक परिभाषित cppफ़ाइल को संकलित करके कुछ भाषा सुविधाओं के लिए परीक्षण करने की अनुमति देता है और इस पर निर्भर करता है कि संकलन विफल है या नहीं कि आप परिभाषित कर सकते हैं।
t.niese

यदि आप सीमोक को ऑटोकॉन्फ़ पसंद करते हैं, तो यह उनके लिए पूर्वनिर्धारित परीक्षण है। AC_TYPE_INT8_Tआदि
शॉन

अगर किसी के पास stdint में कोई टैग स्कोर है , तो IMO cstdint को एक पर्याय के रूप में नामांकित किया जाना चाहिए ( stackoverflow.com/tags/stdint/synonyms )। मुझे नहीं लगता कि हमें इस अस्पष्ट बात के लिए अलग सी और सी ++ टैग चाहिए; प्रश्न पर मुख्य टैग पर्याप्त है।
पीटर कॉर्डेस

1
@PeterCordes इस बार काम किया: stackoverflow.com/tags/stdint/synonyms
एंड्रयू हेनले

जवाबों:


16

यह निर्धारित करने के लिए कि एक निश्चित-चौड़ाई पूर्णांक प्रकार प्रदान की गई है, तो आप जांच सकते हैं कि क्या संबंधित [U]INT*_MAXया [U]INT*_MINमैक्रोज़ परिभाषित किया गया है।

// may be necessary for your C++ implementation
#define __STDC_LIMIT_MACROS 
#include <cstdint>

#ifdef INT32_MAX
// int32_t must be available to get here
int32_t some32bitIntVariable;
#endif

प्रति 7.20 पूर्णांक प्रकार<stdint.h> , C11 मानक के पैराग्राफ 4 (बोल्ड भागों पर ध्यान दें):

इसमें वर्णित प्रत्येक प्रकार के लिए जो कार्यान्वयन प्रदान करता है, <stdint.h>उस typedefनाम को घोषित करेगा और संबंधित मैक्रो को परिभाषित करेगा । इसके विपरीत, यहां वर्णित प्रत्येक प्रकार के लिए जो कार्यान्वयन प्रदान नहीं करता है, <stdint.h>उस typedefनाम की घोषणा नहीं करेगा और न ही संबंधित मैक्रो को परिभाषित करेगा

C ++ के माध्यम से C कार्यान्वयन विरासत में मिला है <cstdint>। देखें <cstdint>बनाम<stdint.h> कुछ जानकारी के लिए। यह भी देखें कि क्या करें __STDC_LIMIT_MACROSऔर क्या करें __STDC_CONSTANT_MACROS? विवरण के लिए __STDC_LIMIT_MACROS

इस प्रकार, यदि int32_tउपलब्ध है, INT32_MAXऔर INT32_MINहोना चाहिए #define'डी। इसके विपरीत, यदि int32_tउपलब्ध नहीं है, तो INT32_MAXन तो डी INT32_MINहोने #defineकी अनुमति है और न ही ।

नोट करें, जैसा कि @NicolBolas ने एक अन्य उत्तर में कहा है , यह वास्तव में जाँच करने के लिए आवश्यक नहीं हो सकता है।


यह [U]INT*_Cमिनट और अधिकतम मैक्रोज़ के बजाय के लिए जाँच करने के लिए कम होगा
1

1
सिवाय इसके कि केवल एक ही बात नहीं है। जैसे INT64_Cपरिभाषित किया गया है यदि int64_least_tउपलब्ध है, यदि int64_tउपलब्ध नहीं है। प्रलेखन का
को कक्षा

19

मोटे तौर पर बोल ... आप नहीं।

यदि आपको निश्चित आकार के पूर्णांक प्रकारों का उपयोग करने की आवश्यकता है, तो इसका मतलब है कि आपको स्पष्ट रूप से उन प्रकारों की आवश्यकता है जो उनके विशिष्ट आकार के हों। यदि आप उन आकारों के पूर्णांक प्राप्त नहीं कर सकते हैं, तो आपका कोड गैर-कार्यात्मक होगा। तो आपको बस उनका उपयोग करना चाहिए; यदि कोई आपके कोड का उपयोग उस कंपाइलर पर करता है जिसमें उक्त प्रकारों की कमी है, तो आपका कोड संकलित नहीं होगा। यह ठीक है, क्योंकि आपके कोड ने काम नहीं किया होता अगर वह संकलन करता।

यदि आपको वास्तव में निश्चित आकार के पूर्णांक की आवश्यकता नहीं है, लेकिन बस उन्हें किसी अन्य कारण से चाहते हैं, तो int_least_*प्रकारों का उपयोग करें । यदि कार्यान्वयन आपको वह आकार दे सकता है, तो उस आकार के least_*प्रकार होंगे।


4
यह सच नहीं है। मैंने स्टब पस्सथ्रूज़ लिखे हैं जो उन प्लेटफार्मों के लिए ऑपरेटर = / आदि को लागू करते हैं जो पहले uint8_t का समर्थन नहीं करते हैं। लेकिन दक्षता और डिबगिंग के उद्देश्यों के लिए आप पस्चथ्र का उपयोग नहीं करना चाहते हैं जब तक कि वास्तव में इसकी आवश्यकता न हो।
TLW

@TLW: " मैंने मंच के लिए ऑपरेटर = / etc को लागू करने वाले स्टब पसथ्रूज़ लिखे हैं जो इससे पहले uint8_t का समर्थन नहीं करते हैं। " ठीक है, लेकिन ... क्यों? आप कौन सा कोड लिख रहे थे जो यह निश्चित होना चाहिए कि एक बाइट 8 बिट्स है (जो संभवतः आप उपयोग क्यों कर रहे थे uint8_t), लेकिन इस कोड को किसी ऐसे प्लेटफॉर्म पर चलाने की आवश्यकता है जहां एक बाइट 8 बिट्स नहीं है (जो, इसके अलावा एक का उपयोग करने के लिए) पुराने C ++ कार्यान्वयन, केवल एक ही कारण uint8_tहोगा जो उपलब्ध नहीं होगा)? यही है, पीछे की संगतता के बाहर, आपको ऐसा करने की आवश्यकता क्यों थी?
निकोल बोलस

मालिकाना इसलिए बहुत ज्यादा नहीं कह सकता। साझा कोडबेस जिसे अन्य चीजों के बीच, बल्कि एक विचित्र हार्डवेयर स्टैक का समर्थन करने की आवश्यकता है। पहले के तदर्थ (और अक्सर टूटे) दृष्टिकोण की तुलना में बहुत स्पष्ट uint8_tथा ।
TLW

यदि आपके पास एक एल्गोरिथ्म है जो उदाहरण के लिए 8-बिट बाइट्स के रूप में व्यक्त किया गया है, तो एक पॉटस्ट्रॉथ एक ऐसी चीज है जिसे आप एक बार लिख सकते हैं और परीक्षण करना आसान है। जबकि प्रत्येक स्थान को ठीक करना तदर्थ रूप से गलत होना आसान है। O(1)बनाम O(n)प्रयास। इसी कारण से लोग उदाहरण के लिए उपयोग करते हैं uint16_t। आप पूछ रहे हैं "क्यों नहीं uint32_t का उपयोग करें और इसे स्वयं डाली?", जिसका उत्तर स्पष्ट होना चाहिए।
TLW

@TLW: " इसी कारण लोग उदा u1616_t का उपयोग करते हैं। " यह मेरे उपयोग करने का कारण नहीं है uint16_t। मेरा कारण यह है कि मैं एक उपकरण / प्रारूप / आदि के साथ संचार कर रहा हूं जो कि मेरी मशीन के लिए एंडियन का उपयोग करके द्विआधारी, अहस्ताक्षरित पूर्णांक के रूप में प्रारूपित 16 बिट डेटा प्राप्त करने की उम्मीद कर रहा है, और अगर मुझे एक प्रकार नहीं मिल सकता है जो है ठीक है कि, फिर इसके साथ प्रभावी ढंग से संवाद करना अधिक कठिन है। मेरा कार्यक्रम (और एपीआई जो मैं इसके साथ उपयोग करता हूं) मौलिक रूप से एक मशीन पर कार्य नहीं कर सकता है जो कि प्रदान नहीं करता है।
निकोल बोलस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.