2008-09-16 10 views
17

क्या सी ++ में 64 बिट एनम होने का कोई तरीका है? कुछ कोड को रिफैक्टर करने के दौरान मैं # डिफाइनों के समूह में आया जो एक enum के रूप में बेहतर होगा, लेकिन 32 बिट से अधिक होने से संकलक त्रुटि में पड़ता है।सी ++ में 64 बिट एनम?

किसी कारण से मैंने सोचा था कि निम्नलिखित काम कर सकते हैं:

enum MY_ENUM : unsigned __int64 
{ 
    LARGE_VALUE = 0x1000000000000000, 
}; 
+0

वहाँ 'uint64_t' से अधिक' अहस्ताक्षरित __int64' पसंद करते हैं करने के लिए एक कारण है? मुझे लगता है कि 'uint64_t' लगभग हर प्रासंगिक प्लेटफ़ॉर्म के लिए परिभाषित किया गया है, लेकिन 'हस्ताक्षरित __int64' प्लेटफॉर्म (हार्डवेयर, कंपाइलर या यहां तक ​​कि लाइब्रेरी) की विशिष्ट परिभाषा की तरह लगता है। – Johan

उत्तर

14

मुझे नहीं लगता कि यह सी ++ 98 के साथ संभव है। Enums का अंतर्निहित प्रतिनिधित्व संकलक तक है।

const __int64 LARGE_VALUE = 0x1000000000000000L; 

सी ++ 11 के रूप में, यह संभव है enum के आधार प्रकार निर्दिष्ट करने enum वर्गों का उपयोग करने के:

enum class MY_ENUM : unsigned __int64 { 
    LARGE_VALUE = 0x1000000000000000ULL 
}; 

अलावा enum में उस मामले में, आप का उपयोग कर बेहतर होगा कक्षाएं एक नया नाम गुंजाइश पेश करती हैं। तो LARGE_VALUE का जिक्र करने के बजाय, आप MY_ENUM::LARGE_VALUE का संदर्भ लेंगे।

+0

यही वह है जो मैंने अंत में किया था, लेकिन मैं इस बारे में उत्सुक था कि 64 बिट enums संभव है, यहां तक ​​कि एक कंपाइलर विशिष्ट एक्सटेंशन के साथ भी। – Rob

0

सी में एक enum ++ किसी भी अभिन्न प्रकार हो सकता है। उदाहरण के लिए, आप चार्ज का एक enum कर सकते हैं। आईई:

enum MY_ENUM 
{ 
    CHAR_VALUE = 'c', 
}; 

मैं ग्रहण करेंगे इस __int64 भी शामिल है। बस

enum MY_ENUM 
{ 
    LARGE_VALUE = 0x1000000000000000, 
}; 

प्रयास करें मेरी टिप्पणीकार, sixlettervariables के अनुसार, सी में आधार प्रकार, हमेशा एक पूर्णांक हो जाएगा, जबकि C++ आधार प्रकार जो कुछ भी इतना बड़ा सबसे बड़ा शामिल मूल्य फिट करने के लिए है। तो उपरोक्त दोनों enums काम करना चाहिए।

+1

@ डॉग टी .: जबकि एएनएसआई सी निर्देश देता है कि गणना 'int' डेटा प्रकार का आकार है, आईएसओ सी ++ यह निर्देश देता है कि गणना सभी मानों का प्रतिनिधित्व करने के लिए कम से कम आकार के आकार के हैं। – user7116

1

जब से तुम सी ++ में काम कर रहे हैं, एक और विकल्प हो सकता है

const __int64 LARVE_VALUE = ... 

यह एक एच फ़ाइल में निर्दिष्ट किया जा सकता है।

+0

मैंने पहली कोशिश के साथ 9 वर्णों को धोखा दिया। – Behrooz

2

यदि कंपाइलर संकलन झंडे या किसी अन्य माध्यम से 64 बिट एम्स का समर्थन नहीं करता है तो मुझे लगता है कि इसका कोई समाधान नहीं है।

आप की तरह अपने नमूना कुछ में की तरह कुछ बना सकते हैं:

namespace MyNamespace { 
const uint64 LARGE_VALUE = 0x1000000000000000; 
}; 

और सिर्फ एक enum

MyNamespace::LARGE_VALUE 

या

using MyNamespace; 
.... 
val = LARGE_VALUE; 
+1

और ढीली प्रकार की सुरक्षा, यद्यपि। –

+0

दुर्भाग्य से हां – INS

+2

हमारी वार्तालाप की गति मुझे पत्राचार शतरंज की याद दिलाती है: डी –

1

कोड के अपने snipplet है का उपयोग कर की तरह इसे का उपयोग सी ++ मानक नहीं:

enum MY_ENUM: अहस्ताक्षरित __int64

मतलब नहीं है।

उपयोग स्थिरांक, बजाय __int64 रूप Torlack पता चलता है

+0

उसने इसे एक और घुंघराले ब्रेस भाषा (उदाहरण के लिए सी # इसका समर्थन करता है) या आने वाले सी ++ मानक में देखा है, जहां इसकी अनुमति होगी। –

17

सी ++ 11 का समर्थन करता है यह, इस सिंटैक्स का उपयोग:

enum class Enum2 : __int64 {Val1, Val2, val3}; 
+0

मैं तब करीब था। मुझे कहीं भी 'टाइप' सिंटैक्स के बारे में पढ़ना होगा। – Rob

+2

ध्यान दें कि 'कक्षा' अभी भी वैकल्पिक है। यदि आप पुराने स्टाइल एनम चाहते हैं, लेकिन एक कस्टम प्रकार के साथ, आप भी 'enum moo: long long {...} ' –

4

जवाब __int64 की बात कर समस्या याद आती है। Enum सभी सी ++ कंपाइलर्स में मान्य है जिसमें वास्तविक 64 बिट अभिन्न प्रकार है, यानी कोई सी ++ 11 कंपाइलर, या सी ++ 03 कंपाइलर्स उचित एक्सटेंशन के साथ। C++ 03 के लिए एक्सटेंशन __int64 कंपाइलर्स में अलग-अलग काम करते हैं, जिसमें इसकी उपयुक्तता समरूपता के लिए आधार प्रकार के रूप में होती है।

0

MSVC++ में आप यह कर सकते हैं:

enum MYLONGLONGENUM: __ int64 {BIG_KEY = 0x3034303232303330, ...};

+2

एक जादू जंगली अनुमान से int64-max का बेहतर उपयोग कर सकते हैं। –

5

तो C++0x कहा जाता है की वर्तमान मसौदा, यह n3092 है 7.2 गणन घोषणाओं, पैरा 6 में कहते हैं:

यह है कार्यान्वयन से परिभाषित जो अभिन्न प्रकार है कि सिवाय अंतर्निहित प्रकार के रूप में प्रयोग किया जाता है अंतर्निहित प्रकार int से अधिक नहीं होगा जब तक कि गणनाकर्ता का मान int या हस्ताक्षरित int में फिट नहीं हो सकता है।

एक ही पैराग्राफ भी कहते हैं:

कोई अभिन्न प्रकार सभी प्रगणक मूल्यों का प्रतिनिधित्व कर सकते हैं, गणन बीमार ही बना है।

हिस्सा की मेरी व्याख्या जब तक कि एक प्रगणक का मूल्य एक पूर्णांक या अहस्ताक्षरित int में फिट नहीं कर सकते कि यह पूरी तरह से वैध और सुरक्षित रूप में लंबे समय है के रूप में 64-बिट पूर्णांक मान के साथ प्रगणक आरंभ करने के लिए है 64 एक बिट सी ++ कार्यान्वयन में प्रदान किया गया बिट पूर्णांक प्रकार।

उदाहरण के लिए:

enum MyEnum 
{ 
    Undefined = 0xffffffffffffffffULL 
}; 
+3

यदि आप अपने एफ की गिनती नहीं करना चाहते हैं तो आप केवल 'अपरिभाषित = ~ 0x0ULL' कर सकते हैं –

1

Enum प्रकार सामान्य रूप से पहले enum प्रारंभकर्ता के डेटा प्रकार से निर्धारित होता है। यदि मान उस अभिन्न डेटाटाइप के लिए सीमा से अधिक होना चाहिए तो C++ संकलक यह सुनिश्चित करेगा कि यह एक बड़े अभिन्न डेटा प्रकार का उपयोग करके फिट बैठता है। अगर संकलक को पता चलता है कि यह किसी भी अभिन्न डेटा प्रकार से संबंधित नहीं है तो संकलक त्रुटि फेंक देगा। रेफरी: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf
संपादित करें: हालांकि यह विशुद्ध रूप से मशीन वास्तुकला पर निर्भर है