C
enum stuff q;
enum stuff {a, b=-4, c, d=-2, e, f=-3, g} s;
sTam tipte imzalı tamsayı için geçici bir tanım olarak hareket eden beyan qve kapsamda eksik tipte imzalı tamsayı için geçici bir tanım olarak hareket eden beyan (tip tanımı, kapsam) (herhangi bir belirsiz tanım gibi, tanımlayıcılar qve saynı türdeki eksik veya tam sürümle intveya enum stuffbirden çok kez yeniden tanımlanabilir, ancak kapsamda yalnızca bir kez tanımlanabilir yani int q = 3; ve yalnızca bir alt kapsamda yeniden tanımlanabilir ve yalnızca tanımdan sonra kullanılabilir). Ayrıca enum stuff, bir tür tanımı olarak hareket ettiğinden, kapsamda yalnızca bir kez tam türü kullanabilirsiniz .
Bir derleyici numaralandırma türü tanımı enum stuffda dosya kapsamında (öncesinde ve altında kullanılabilir) ve ileri tür bildiriminde (türün enum stuffbirden çok bildirimi olabilir, ancak kapsamda yalnızca bir tanım / tamamlanma olabilir ve bir alt kapsamda yeniden tanımlanabilir) . Ayrıca yerine bir derleyici yönergesi olarak hareket arvalue ile 0, bile -4, cile 5, dile -2, eile -3, file -1ve gile -2geçerli kapsam içinde. Numaralandırma sabitleri artık tanımdan sonra, aynı kapsam düzeyinde bulunamayan farklı bir numarada bir sonraki yeniden tanımlamaya kadar uygulanır.
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 ve birlik tarafından paylaşılan etiket ad ayrıdır ve sonra C yani yazın anahtar kelime (enum, struct ya birlik) eklenmeli enum a {a} b, enum a ckullanılan ve kullanılması gerektiğini a c. Etiket ad alanı, tanımlayıcı ad alanından ayrı olduğu için enum a {a} bizin verilir ancak enum a {a, b} bsabitler, değişken tanımlayıcıları, tanımlayıcı ad alanı ile aynı ad alanında olduğundan dolayı değildir.typedef enum a {a,b} btypedef-names, tanımlayıcı ad alanının bir parçası olduğu için de izin verilmez.
enum boolC tipi ve sabitleri C'de aşağıdaki paterni izler:
+--------------+-----+-----+-----+
| 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 |
+-----------+-----+---------------+------+
Bu C de iyi derler:
#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 ++
C ++ 'da numaralandırmaların bir türü olabilir
enum Bool: bool {True, False} Bool;
enum Bool: bool {True, False, maybe} Bool; //error
Bu durumda, sabitler ve tanımlayıcıların tümü aynı türe, boole sahiptir ve bir sayı bu türle temsil edilemezse bir hata oluşur. Belki = 2, bu bir bool değil. Ayrıca, True, False ve Bool küçük harf olamaz, aksi takdirde dil anahtar sözcükleriyle çakışırlar. Bir numaralandırma ayrıca bir işaretçi türüne sahip olamaz.
C ++ kurallarında numaralandırma kuralları farklıdır.
#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 ++ 'daki numaralandırma değişkenleri artık yalnızca işaretsiz tamsayılar vb. Değildir, ayrıca numaralandırma türündedir ve yalnızca numaralandırmada sabitler atanabilir. Ancak bu atılabilir.
#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
}
Numaralandırma sınıfları
enum struct ile aynı 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
}
Kapsam çözümleme operatörü, kapsamı olmayan numaralandırmalar için hala kullanılabilir.
#include <stdio.h>
enum a: bool {l, w} ;
int main() {
enum a: bool {w, l} f;
printf("%llu", ::a::w);
}
Ancak w, kapsamda başka bir şey olarak tanımlanamayacağı için, ::wve arasında bir fark yoktur.::a::w