C
enum stuff q;
enum stuff {a, b=-4, c, d=-2, e, f=-3, g} s;
s
Tam tipte imzalı tamsayı için geçici bir tanım olarak hareket eden beyan q
ve 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 q
ve s
aynı türdeki eksik veya tam sürümle int
veya enum stuff
birden ç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 stuff
da dosya kapsamında (öncesinde ve altında kullanılabilir) ve ileri tür bildiriminde (türün enum stuff
birden ç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 a
rvalue ile 0
, b
ile -4
, c
ile 5
, d
ile -2
, e
ile -3
, f
ile -1
ve g
ile -2
geç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 c
kullanı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} b
izin verilir ancak enum a {a, b} b
sabitler, 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} b
typedef-names, tanımlayıcı ad alanının bir parçası olduğu için de izin verilmez.
enum bool
C 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, ::w
ve arasında bir fark yoktur.::a::w