ค
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
ในขอบเขตปัจจุบัน ค่าคงที่การแจงนับตอนนี้ใช้หลังจากการกำหนดจนกระทั่งนิยามใหม่ต่อไปใน enum อื่นซึ่งไม่สามารถอยู่ในระดับขอบเขตเดียวกัน
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 และ union ถูกแยกออกและจะต้องนำหน้าด้วยคีย์เวิร์ด type (enum, struct หรือ union) ใน C คือหลังจากenum a {a} b
นั้นenum a c
ต้องใช้และไม่a c
ใช้ เนื่องจากแท็กเนมสเปซแยกจากเนมสเปซของตัวระบุenum a {a} b
จึงได้รับอนุญาต แต่enum a {a, b} b
ไม่ใช่เพราะค่าคงที่อยู่ในเนมสเปซเดียวกันกับตัวระบุตัวแปรนั่นคือเนมสเปซของตัวระบุ typedef enum a {a,b} b
ไม่อนุญาตด้วยเนื่องจาก typedef-names เป็นส่วนหนึ่งของ namespace ของตัวระบุ
ประเภทของ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 ++
ใน C ++, enums สามารถมีประเภทได้
enum Bool: bool {True, False} Bool;
enum Bool: bool {True, False, maybe} Bool; //error
ในสถานการณ์นี้ค่าคงที่และตัวระบุทั้งหมดมีชนิดเดียวกันบูลและข้อผิดพลาดจะเกิดขึ้นหากไม่สามารถแสดงตัวเลขด้วยชนิดนั้น อาจ = 2 ซึ่งไม่ใช่บูล นอกจากนี้จริงเท็จและ Bool ไม่สามารถเป็นตัวพิมพ์เล็กมิฉะนั้นพวกเขาจะปะทะกับคำหลักภาษา enum ยังไม่สามารถมีชนิดพอยน์เตอร์ได้
กฎสำหรับ enums แตกต่างกันใน 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;
}
ตัวแปร Enums ใน C ++ ไม่ได้เป็นเพียงจำนวนเต็มที่ไม่ได้ลงชื่ออีกต่อไป แต่ยังเป็น enum type และสามารถกำหนดค่าคงที่ใน 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
}
ตัวดำเนินการแก้ไขปัญหาขอบเขตยังคงสามารถใช้สำหรับ enums ที่ไม่มีขอบเขต
#include <stdio.h>
enum a: bool {l, w} ;
int main() {
enum a: bool {w, l} f;
printf("%llu", ::a::w);
}
แต่เนื่องจาก w ไม่สามารถนิยามเป็นอย่างอื่นในขอบเขตจึงไม่มีความแตกต่างระหว่าง::w
และ::a::w