सी
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
में कई डिक्लेरेशन हो सकते हैं लेकिन स्कोप में केवल एक ही डेफिनिशन / पूरा हो सकता है और एक सबसकोप में इसे फिर से परिभाषित किया जा सकता है) । यह भी एक संकलक निर्देश स्थानापन्न करने के रूप में कार्य a
rvalue साथ 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 bool
C में निम्नलिखित पैटर्न का प्रकार और स्थिरांक निम्नलिखित हैं:
+--------------+-----+-----+-----+
| 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