सी
enum stuff q;
enum stuff {a, b=-4, c, d=-2, e, f=-3, g} s;
घोषणा जो sपूर्ण प्रकार और घोषणा के साथ एक हस्ताक्षरित पूर्णांक की एक अस्थायी परिभाषा के रूप में कार्य करती है जो qकार्यक्षेत्र में अपूर्ण प्रकार के साथ हस्ताक्षरित पूर्णांक की एक अस्थायी परिभाषा के रूप में कार्य करता है (जो कि पूर्ण प्रकार के दायरे में हल होता है क्योंकि प्रकार परिभाषा कहीं भी मौजूद है गुंजाइश) (किसी भी अस्थायी परिभाषा की तरह, पहचानकर्ता qऔर sएक ही प्रकार intया enum stuffकई बार के अपूर्ण या पूर्ण संस्करण के साथ पुन: घोषित किया जा सकता है लेकिन केवल एक बार दायरे में परिभाषित किया जाता है अर्थात int q = 3; और केवल एक उप-भाग में पुनर्परिभाषित किया जा सकता है, और केवल परिभाषा के बाद प्रयोग करने योग्य)। इसके अलावा, आप केवल enum stuffएक बार पूर्ण प्रकार का उपयोग कर सकते हैं क्योंकि यह एक प्रकार की परिभाषा के रूप में कार्य करता है।
इसके लिए एक कंपाइलर एन्यूमरेशन टाइप डेफिनिशन enum stuffभी फाइल स्कोप (प्रयोग करने योग्य पहले और नीचे) के साथ-साथ फॉरवर्ड टाइप डिक्लेरेशन में प्रस्तुत की जाती है (टाइप enum stuffमें कई डिक्लेरेशन हो सकते हैं लेकिन स्कोप में केवल एक ही डेफिनिशन / पूरा हो सकता है और एक सबसकोप में इसे फिर से परिभाषित किया जा सकता है) । यह भी एक संकलक निर्देश स्थानापन्न करने के रूप में कार्य arvalue साथ 0, bसाथ -4, cसाथ 5, dसाथ -2, eसाथ -3, fसाथ -1और gसाथ -2वर्तमान क्षेत्र में। एन्यूमरेशन स्थिरांक अब परिभाषा के बाद एक अलग एनम में अगले पुनर्परिवर्तन तक लागू होते हैं जो समान स्कोप स्तर पर नहीं हो सकते।
typedef enum bool {false, true} bool;
//this is the same as
enum bool {false, true};
typedef enum bool bool;
//or
enum bool {false, true};
typedef unsigned int bool;
//remember though, bool is an alias for _Bool if you include stdbool.h.
//and casting to a bool is the same as the !! operator
टैग नाम स्थान enum, struct और संघ द्वारा साझा अलग है और बाद प्रकार कीवर्ड (enum, struct या संघ) सी यानी में से उपसर्ग होना चाहिए enum a {a} b, enum a cऔर इस्तेमाल किया जाना चाहिए नहीं a c। क्योंकि टैग नामस्थान पहचानकर्ता नामस्थान के लिए अलग है, enum a {a} bकी अनुमति है, लेकिन enum a {a, b} bइसलिए नहीं है क्योंकि स्थिरांक वैसा ही नाम स्थान में है जैसा कि चर पहचानकर्ता, पहचानकर्ता नाम स्थान। typedef enum a {a,b} bइसलिए भी अनुमति नहीं है क्योंकि टाइप किए गए नाम पहचानकर्ता नामस्थान का हिस्सा हैं।
enum boolC में निम्नलिखित पैटर्न का प्रकार और स्थिरांक निम्नलिखित हैं:
+--------------+-----+-----+-----+
| enum bool | a=1 |b='a'| c=3 |
+--------------+-----+-----+-----+
| unsigned int | int | int | int |
+--------------+-----+-----+-----+
+--------------+-----+-----+-----+
| enum bool | a=1 | b=-2| c=3 |
+--------------+-----+-----+-----+
| int | int | int | int |
+--------------+-----+-----+-----+
+--------------+-----+---------------+-----+
| enum bool | a=1 |b=(-)0x80000000| c=2 |
+--------------+-----+---------------+-----+
| unsigned int | int | unsigned int | int |
+--------------+-----+---------------+-----+
+--------------+-----+---------------+-----+
| enum bool | a=1 |b=(-)2147483648| c=2 |
+--------------+-----+---------------+-----+
| unsigned int | int | unsigned int | int |
+--------------+-----+---------------+-----+
+-----------+-----+---------------+------+
| enum bool | a=1 |b=(-)0x80000000| c=-2 |
+-----------+-----+---------------+------+
| long | int | long | int |
+-----------+-----+---------------+------+
+-----------+-----+---------------+------+
| enum bool | a=1 | b=2147483648 | c=-2 |
+-----------+-----+---------------+------+
| long | int | long | int |
+-----------+-----+---------------+------+
+-----------+-----+---------------+------+
| enum bool | a=1 | b=-2147483648 | c=-2 |
+-----------+-----+---------------+------+
| int | int | int | int |
+-----------+-----+---------------+------+
+---------------+-----+---------------+-----+
| enum bool | a=1 | b=99999999999 | c=1 |
+---------------+-----+---------------+-----+
| unsigned long | int | unsigned long | int |
+---------------+-----+---------------+-----+
+-----------+-----+---------------+------+
| enum bool | a=1 | b=99999999999 | c=-1 |
+-----------+-----+---------------+------+
| long | int | long | int |
+-----------+-----+---------------+------+
यह C में ठीक संकलित करता है:
#include <stdio.h>
enum c j;
enum c{f, m} p;
typedef int d;
typedef int c;
enum c j;
enum m {n} ;
int main() {
enum c j;
enum d{l};
enum d q;
enum m y;
printf("%llu", j);
}
सी ++
C ++ में, enums का एक प्रकार हो सकता है
enum Bool: bool {True, False} Bool;
enum Bool: bool {True, False, maybe} Bool; //error
इस स्थिति में, स्थिरांक और पहचानकर्ता सभी के पास एक ही प्रकार, बूल और एक त्रुटि होगी यदि कोई संख्या उस प्रकार द्वारा प्रतिनिधित्व नहीं की जा सकती है। शायद = 2, जो एक बूल नहीं है। इसके अलावा, सही, गलत और बूल कम मामले नहीं हो सकते हैं अन्यथा वे भाषा के कीवर्ड के साथ टकराएंगे। एक enum में एक सूचक प्रकार भी नहीं हो सकता है।
सी ++ में एनम के नियम अलग हैं।
#include <iostream>
c j; //not allowed, unknown type name c before enum c{f} p; line
enum c j; //not allowed, forward declaration of enum type not allowed and variable can have an incomplete type but not when it's still a forward declaration in C++ unlike C
enum c{f, m} p;
typedef int d;
typedef int c; // not allowed in C++ as it clashes with enum c, but if just int c were used then the below usages of c j; would have to be enum c j;
[enum] c j;
enum m {n} ;
int main() {
[enum] c j;
enum d{l}; //not allowed in same scope as typedef but allowed here
d q;
m y; //simple type specifier not allowed, need elaborated type specifier enum m to refer to enum m here
p v; // not allowed, need enum p to refer to enum p
std::cout << j;
}
C ++ में Enums चर अब केवल अहस्ताक्षरित पूर्णांक आदि नहीं हैं, वे Enum प्रकार के भी हैं और केवल Enum में स्थिरांक दिए जा सकते हैं। यह हालांकि दूर डाली जा सकती है।
#include <stdio.h>
enum a {l} c;
enum d {f} ;
int main() {
c=0; // not allowed;
c=l;
c=(a)1;
c=(enum a)4;
printf("%llu", c); //4
}
Enum कक्षाएं
enum struct के समान है enum class
#include <stdio.h>
enum class a {b} c;
int main() {
printf("%llu", a::b<1) ; //not allowed
printf("%llu", (int)a::b<1) ;
printf("%llu", a::b<(a)1) ;
printf("%llu", a::b<(enum a)1);
printf("%llu", a::b<(enum class a)1) ; //not allowed
printf("%llu", b<(enum a)1); //not allowed
}
स्कोप रिज़ॉल्यूशन ऑपरेटर अभी भी गैर-स्कॉप्ड एनम के लिए उपयोग किया जा सकता है।
#include <stdio.h>
enum a: bool {l, w} ;
int main() {
enum a: bool {w, l} f;
printf("%llu", ::a::w);
}
लेकिन क्योंकि w को दायरे में किसी और चीज के रूप में परिभाषित नहीं किया जा सकता है, ::wऔर इसके बीच कोई अंतर नहीं है::a::w