C
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
、タイプ定義として機能するため、スコープ内で 1回。
のコンパイラ列挙型定義enum stuff
は、ファイルスコープ(前後で使用可能)および前方型宣言にも存在します(型にenum stuff
は複数の宣言を含めることができますが、スコープ内の定義/完了は1つだけで、サブスコープで再定義できます)。 。また、現在のスコープ内で、a
rvalue 0
、b
with -4
、c
with 5
、d
with -2
、e
with -3
、f
with -1
、g
with -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、およびunionによって共有されるタグ名前空間は別個であり、Cでtypeキーワード(enum、struct、またはunion)を前に付ける必要があります。つまり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は識別子の名前空間の一部であるため、これも許可されていません。
のタイプ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 ++では、列挙型は型を持つことができます
enum Bool: bool {True, False} Bool;
enum Bool: bool {True, False, maybe} Bool; //error
この場合、定数と識別子はすべて同じ型のブール値を持ち、数値をその型で表すことができない場合はエラーが発生します。多分= 2、これはブールではありません。また、True、False、Boolを小文字にすることはできません。そうしないと、言語のキーワードと競合します。列挙型もポインタ型を持つことはできません。
列挙型の規則は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 ++の列挙型変数は、単に符号なし整数などではなくなりました。また、列挙型であり、定数は列挙内でのみ割り当てることができます。ただし、これは捨てることができます。
#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 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