C में एनम का आकार क्या है?


140

मैं enum मानों का एक सेट बना रहा हूं, लेकिन मुझे 64 बिट्स चौड़ा होने के लिए प्रत्येक enum मान की आवश्यकता है। यदि मैं सही ढंग से याद करता हूं, तो एक एनुम आमतौर पर एक इंट के समान आकार का होता है; लेकिन मुझे लगा कि मैंने कहीं पढ़ा है कि (कम से कम जीसीसी में) कंपाइलर को अपने मूल्यों को धारण करने के लिए किसी भी चौड़ाई की जरूरत हो सकती है। तो, क्या यह संभव है कि 64 बिट्स चौड़ा हो?


1
तो अगर मैं अच्छी तरह से समझता हूं, तो आपके लिए 2 ^ 32 एनम पर्याप्त नहीं हैं? या यह एक संरेखण चिंता है, आपको 32 के बजाय 64 की आवश्यकता क्यों है, मैं बहुत उत्सुक हूं।
जोकिन

1
@ जोकून: मैं ईमानदारी से याद नहीं करता। मुझे लगता है कि मैं चाहता था कि दुश्मनी 2 ^ 32-1 से बड़े मूल्यों को समाहित करे।
मपदी

एक उपयोग होगा यदि आपको एक एनम और पॉइंटर के बीच एक संघ की आवश्यकता है।
डेमी

जवाबों:


97

एक enumही पकड़ के लिए बड़ा पर्याप्त होने की गारंटी है intमान। संकलक परिभाषित की गई स्थिरांक के आधार पर उपयोग किए जाने वाले वास्तविक प्रकार को चुनने के लिए स्वतंत्र है, इसलिए यह एक छोटे प्रकार का चयन कर सकता है यदि यह आपके द्वारा परिभाषित मूल्यों का प्रतिनिधित्व कर सकता है। यदि आपको एन्यूमरेशन स्थिरांक की आवश्यकता है जो intआपको फिट नहीं है तो ऐसा करने के लिए संकलक-विशिष्ट एक्सटेंशन का उपयोग करना होगा।


12
आपका पहला वाक्य आपके अंतिम संघर्ष के साथ लगता है। अड़चन है कि एenum से बड़ा होना चाहिए intया छोटा? @MichaelStum के उत्तर के बाद आपका पहला वाक्य होना चाहिए " enumकेवल एक intमूल्य में फिट होने की गारंटी है ।"
हास्केलएलेह

Twos पूरक प्लेटफार्मों पर एक बदसूरत कार्यान्वयन संवेदनशील हैक के रूप में (इन दिनों सभी प्रणालियों है कि?), आप यह सुनिश्चित कर सकते हैं कि यह एक नकारात्मक मान के साथ एक int जितना बड़ा हो सकता है। हालांकि अनुशंसित तकनीक नहीं।
दिल्लगी

7
इस उत्तर से लगता है कि एक एनुम एक जितना बड़ा है intमाइकल स्टम का जवाब , जो C99 का संदर्भ देता है, का कहना है कि एक एनुम a जितना छोटा हो सकता है char
फ्रैंक केल्स

3
इस उत्तर का पहला वाक्य गलत है। enumकेवल गारंटी दी जाती है कि एनम में सबसे बड़े एन्यूमरेटर का मान रखने के लिए पर्याप्त बड़ा होना चाहिए।
MM

91

वर्तमान C मानक (C99) से लिया गया: http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

6.7.2.2 गणन निर्दिष्टक
[...]
बाधा
की गणना करने वाली अभिव्यक्ति एक पूर्णांक स्थिरांक अभिव्यक्ति होगी जो एक मान के रूप में एक प्रतिनिधित्व योग्य है।
[...]
प्रत्येक प्रगणित प्रकार चार, एक हस्ताक्षरित पूर्णांक प्रकार, या एक अहस्ताक्षरित पूर्णांक प्रकार के साथ संगत होगा। प्रकार का विकल्प कार्यान्वयन-परिभाषित है, लेकिन गणना के सभी सदस्यों के मूल्यों का प्रतिनिधित्व करने में सक्षम होगा।

ऐसा नहीं है कि कंपाइलर्स मानक का पालन करने में किसी भी तरह से अच्छे हैं, लेकिन अनिवार्य रूप से: यदि आपका एनम एक इंट के अलावा और कुछ भी रखता है, तो आप गहरे "असमर्थित व्यवहार में हैं जो आपको एक या दो साल में वापस आ सकता है।"


3
केवल होने के बाद, निम्नलिखित मुझे लगता है कि मान्य है: enum {LAST = INT_MAX, LAST1, LAST2}; इसलिए LAST2 int में प्रतिनिधित्व करने योग्य नहीं है, लेकिन इसे परिभाषित करने वाली कोई अभिव्यक्ति नहीं थी।
जोहान्स शाउब -

4
वास्तविक पीडीएफ में यह परिभाषित किया गया है कि: "एक एन्यूमरेटर सूची में पहचानकर्ताओं को कॉन्स्टेंट के रूप में घोषित किया जाता है जिनके पास int [...]" होता है। मैंने इसे छोड़ दिया है ताकि इसे बहुत अधिक क्रियाशील न बनाया जा सके।
माइकल Stum

2
नोट " एक हस्ताक्षरित पूर्णांक प्रकार, या एक अहस्ताक्षरित पूर्णांक प्रकार"। जरूरी नहीं है intshortऔर longपूर्णांक प्रकार भी हैं, और जो कुछ भी लागू होता है, सभी मान फिट होने चाहिए (" गणन के सभी सदस्यों के मूल्यों का प्रतिनिधित्व करने में सक्षम होंगे ")।

3
उल्लेखनीय: एन्यूमरेशन स्थिर और एन्यूमरेटेड प्रकार एक ही बात नहीं है । पूर्व में एनम घोषणा सूची की सामग्री है, बाद वाला वास्तविक चर है। तो जबकि एन्यूमरेशन कांस्टेंट होना चाहिए int, वास्तविक एन्यूमरेशन वैरिएबल एक अन्य प्रकार हो सकता है। यह मानक में एक प्रसिद्ध असंगति है।
लंडिन

1
लुंडिन के बिंदु को स्पष्ट करने के लिए: के लिए enum my_enum { my_value }, my_valueप्रकार होगा int, लेकिन enum my_enumएक कार्यान्वयन परिभाषित प्रकार हो सकता है जो कम से कम सभी प्रवर्तन मूल्यों का प्रतिनिधित्व करना चाहिए। इसलिए my_valueइसमें एक संकीर्ण रूपांतरण हो सकता है enum my_enum, लेकिन यह अतिप्रवाह नहीं होने की गारंटी है।
P O'Conbhui

17

हालांकि पिछले उत्तर सही हैं, कुछ कंपाइलरों में मानक तोड़ने और सबसे छोटे प्रकार का उपयोग करने के विकल्प हैं जिनमें सभी मान शामिल होंगे।

जीसीसी के साथ उदाहरण ( जीसीसी मैनुअल में प्रलेखन ):

enum ord {
    FIRST = 1,
    SECOND,
    THIRD
} __attribute__ ((__packed__));
STATIC_ASSERT( sizeof(enum ord) == 1 )

11
दरअसल, जहां तक ​​मैं देख सकता हूं यह मानक नहीं तोड़ता है। जैसा कि माइकल स्टम के जवाब में बताया गया है, मानक कंपाइलर को वास्तविक प्रकार के एनमों को चुनने की अनुमति देता है, जब तक कि सभी मान फिट बैठते हैं।
सेल्के

2
मैंने MacOS C ++ कंपाइलर्स के साथ काम किया है जो छोटे प्रकारों में स्टोर करने के लिए एक एनम में मूल्यों की सीमित सीमा का फायदा उठाते हैं। याद नहीं है अगर यह Metrowerks Codewarrior या XCode था। यह C ++ मानक के भीतर है। आप सामान्य रूप से sizeof (MyEnum) == sizeof (int) नहीं मान सकते।
दिल्लगी

0

बस एनम के अंतिम मूल्य को एक मान के लिए पर्याप्त रूप से सेट करें, जिससे यह पता लगाया जा सके कि आप जिस एनम को चाहते हैं, वह उस आकार का होना चाहिए:

enum value{a=0,b,c,d,e,f,g,h,i,j,l,m,n,last=0xFFFFFFFFFFFFFFFF};

1
हालांकि यह कोड प्रश्न का उत्तर दे सकता है, लेकिन यह समस्या का हल कैसे और / या इसके बारे में अतिरिक्त संदर्भ प्रदान करता है, इससे उत्तर के दीर्घकालिक मूल्य में सुधार होगा।
leopal

-1

एक enumचर के आकार पर हमारा कोई नियंत्रण नहीं है । यह पूरी तरह से कार्यान्वयन पर निर्भर करता है, और कंपाइलर एक पूर्णांक के लिए नाम का उपयोग करने का विकल्प देता है enum, इसलिए पूर्णांक enumके आकार का अनुसरण कर रहा है।


-1

C भाषा में, a enumको आकार के होने की गारंटी है int-fshort-enumsइसे संक्षिप्त रूप देने के लिए एक संकलन समय विकल्प ( ) है (यदि मान 64K से अधिक न हो तो यह मुख्य रूप से उपयोगी है)। इसके आकार को 64 बिट तक बढ़ाने के लिए कोई संकलन समय विकल्प नहीं है।


-6

इस कोड पर विचार करें:

enum value{a,b,c,d,e,f,g,h,i,j,l,m,n};
value s;
cout << sizeof(s) << endl;

यह आउटपुट के रूप में 4 देगा। इसलिए तत्वों की संख्या में कोई फर्क नहीं पड़ता enum, इसका आकार हमेशा तय होता है।


6
माइकल स्टम का जवाब सही है। यह संकलक विशिष्ट है। आप इसे IAR EWARM से खुद आज़मा सकते हैं। IAR EWARM आपके उदाहरण के लिए 1 दिखाता है। अगर 255 आइटम तक यह अभी भी पता चलता है। 1. 256 वें आइटम को जोड़ने के बाद यह 2 तक जाता है।
desowin

11
प्रश्न C ++ के बारे में नहीं है।
माइकल

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