C
enum stuff q;
enum stuff {a, b=-4, c, d=-2, e, f=-3, g} s;
s
Khai báo hoạt động như một định nghĩa dự kiến của một số nguyên đã ký với kiểu hoàn chỉnh và khai báo hoạt động như một định nghĩa dự kiến của số nguyên đã ký q
với loại không đầy đủ trong phạm vi (phân giải thành loại hoàn chỉnh trong phạm vi vì định nghĩa loại có ở bất kỳ đâu trong phạm vi) (giống như bất kỳ định nghĩa dự kiến nào, các định danh q
và s
có thể được phân phối lại với phiên bản chưa hoàn chỉnh hoặc đầy đủ cùng loại int
hoặc enum stuff
nhiều lần nhưng chỉ được xác định một lần trong phạm vi tức là int q = 3; và chỉ có thể được xác định lại trong một phạm vi con và chỉ có thể sử dụng sau khi định nghĩa). Ngoài ra, bạn chỉ có thể sử dụng loại hoàn chỉnh enum stuff
một lần trong phạm vi vì nó hoạt động như một định nghĩa loại.
Một định nghĩa kiểu liệt kê trình biên dịch cho enum stuff
cũng được trình bày ở phạm vi tệp (có thể sử dụng trước và bên dưới) cũng như khai báo kiểu chuyển tiếp (loại enum stuff
có thể có nhiều khai báo nhưng chỉ có một định nghĩa / hoàn thành trong phạm vi và có thể được định nghĩa lại trong một phạm vi con) . Nó cũng hoạt động như một chỉ thị của trình biên dịch để thay thế a
bằng rvalue 0
, b
với -4
, c
với 5
, d
với -2
, e
với -3
, f
với -1
và g
với -2
trong phạm vi hiện tại. Các hằng số liệt kê hiện được áp dụng sau định nghĩa cho đến khi xác định lại tiếp theo trong một enum khác không thể ở cùng một phạm vi.
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
Không gian tên thẻ được chia sẻ bởi enum, struct và union là riêng biệt và phải được thêm tiền tố bởi từ khóa loại (enum, struct hoặc union) trong C tức là sau enum a {a} b
, enum a c
phải được sử dụng và không a c
. Bởi vì không gian tên thẻ tách biệt với không gian tên định danh, enum a {a} b
được phép nhưng enum a {a, b} b
không phải vì các hằng số nằm trong cùng một không gian tên với các định danh biến, không gian tên định danh. typedef enum a {a,b} b
cũng không được phép vì tên typedef là một phần của không gian tên định danh.
Loại enum bool
và hằng số theo mẫu sau trong 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 |
+-----------+-----+---------------+------+
Điều này biên dịch tốt trong 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 ++
Trong C ++, enums có thể có một loại
enum Bool: bool {True, False} Bool;
enum Bool: bool {True, False, maybe} Bool; //error
Trong tình huống này, các hằng số và mã định danh đều có cùng loại, bool và sẽ xảy ra lỗi nếu một số không thể được đại diện bởi loại đó. Có lẽ = 2, đó không phải là một bool. Ngoài ra, True, false và Bool không thể viết thường nếu không chúng sẽ xung đột với các từ khóa ngôn ngữ. Một enum cũng không thể có một loại con trỏ.
Các quy tắc cho enums là khác nhau trong C ++.
#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ác biến Enums trong C ++ không còn là các số nguyên không dấu, v.v., chúng cũng thuộc loại enum và chỉ có thể được gán các hằng số trong enum. Điều này tuy nhiên có thể được bỏ đi.
#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
}
Lớp học Enum
enum struct
giống hệt với 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
}
Toán tử phân giải phạm vi vẫn có thể được sử dụng cho các enum không có phạm vi.
#include <stdio.h>
enum a: bool {l, w} ;
int main() {
enum a: bool {w, l} f;
printf("%llu", ::a::w);
}
Nhưng vì w không thể được định nghĩa là một cái gì đó khác trong phạm vi, nên không có sự khác biệt giữa ::w
và::a::w