forked from dlang/dlang.org
-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathenum.dd
More file actions
227 lines (178 loc) · 5.95 KB
/
enum.dd
File metadata and controls
227 lines (178 loc) · 5.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
Ddoc
$(SPEC_S 列挙体,
$(GRAMMAR
$(GNAME EnumDeclaration):
$(B enum) $(GLINK EnumTag) $(GLINK EnumBody)
$(B enum) $(GLINK EnumBody)
$(B enum) $(GLINK EnumTag) $(B :) $(GLINK EnumBaseType) $(GLINK EnumBody)
$(B enum) $(B :) $(GLINK EnumBaseType) $(GLINK EnumBody)
$(GNAME EnumTag):
$(I Identifier)
$(GNAME EnumBaseType):
$(GLINK2 declaration, Type)
$(GNAME EnumBody):
$(GLINK EmptyEnumBody)
$(GLINK EnumMembersBody)
$(GNAME EmptyEnumBody):
$(B ;)
$(GNAME EnumMembersBody):
$(B {) $(GLINK EnumMembers) $(B })
$(GNAME EnumMembers):
$(GLINK EnumMember)
$(GLINK EnumMember) $(B ,)
$(GLINK EnumMember) $(B ,) $(I EnumMembers)
$(GNAME EnumMember):
$(I Identifier)
$(I Identifier) $(B =) $(ASSIGNEXPRESSION)
$(V2 $(GLINK2 declaration, Type) $(B =) $(ASSIGNEXPRESSION))
)
$(P enum宣言は、関連する整数定数の集まりを定義するのに使用されます。
これには二つの形式があります:
)
$(OL
$(LI $(I EnumTag) のある、名前付き列挙体)
$(LI $(I EnumTag) のない、無名列挙体)
)
<h2>名前付き列挙体</h2>
$(P
名前付き列挙体は、
関連する整数定数の集まりを定義し、新しい型を与えるのに使用されます。
各メンバ $(I EnumMembers)
は、型名 $(I EnumTag) のスコープで定義されます。
$(I EnumTag) は新しい型となり、
メンバはその型を持つようになります。
)
$(P 以下の例では新しい型 $(CODE X) が定義され、各メンバの値は
$(CODE X.A=0), $(CODE X.B=1), $(CODE X.C=2) となります:)
------
enum X { A, B, C } // 名前付き列挙体
------
$(V1
$(P 基底型 $(I EnumBaseType) が指定されていない場合、
$(CODE int) が基底型とされます。)
)
$(V2
$(P $(I EnumBaseType) が指定されていない場合、先頭の
メンバに初期化子があれば、基底型はその初期化子の型になります。
先頭メンバにも初期化子がない場合は、
デフォルトの $(CODE int) が基底型となります。)
$(P 名前付きenumの個々のメンバに $(I Type) 形式で型を指定することはできません。
)
)
$(P 名前付き列挙体のメンバは $(I EnumBaseType)
型に暗黙変換されますが、逆に $(I EnumBaseType)
の値が名前付き列挙体の型に暗黙変換されることはありません。
)
$(P 各メンバの値は初期化子で指定します。
初期化子がない場合、
直前のメンバの値 + 1 となります。最初のメンバに初期化子がなかった場合は、
値は 0 となります。
)
$(P $(I EmptyEnumBody) は不透明な列挙体 - メンバの不明な列挙体 -
を意味します。)
<h3>列挙体のデフォルト初期化値</h3>
$(P 列挙体の $(CODE .init) プロパティは、
先頭のメンバの値となります。
これは、この型の変数のデフォルト初期化値でもあります。
)
------
enum X { A=3, B, C }
X x; // x は 3 に初期化される
------
<h3>列挙体のプロパティ</h3>
$(P これらのプロパティは名前付き列挙体にのみ存在します。
)
$(TABLE1
$(CAPTION 名前付き列挙体のプロパティ)
$(TR $(TD .init) $(TD 先頭のメンバの値))
$(TR $(TD .min) $(TD 最小のメンバの値))
$(TR $(TD .max) $(TD 最大のメンバの値))
$(TR $(TD .sizeof) $(TD 列挙体の値を格納するメモリ領域のサイズ))
)
$(P 例えば:)
---
enum X { A=3, B, C }
X.min // == X.A
X.max // == X.C
X.sizeof // int.sizeof と同じ
---
$(V2
$(P 基底型 $(I EnumBaseType) は、$(CODE .max) and $(CODE .min) プロパティに対応するために、
比較演算が可能な型でなければなりません。
)
)
<h2>無名列挙体</h2>
$(P もし $(I Identifier) がなければ、その列挙体は
$(I 無名列挙体) で、その $(I EnumMembers) は
$(I EnumDeclaration) の存在するスコープで宣言されます。
新しい型は作られません。$(I EnumMembers) は
$(I EnumBaseType) の型を持ちます。
)
$(I EnumBaseType) は、列挙体の元となる型です。
$(V1
$(P これは整数型でなければなりません。
省略時はデフォルトで $(B int) になります。
)
)
$(V2
$(P 省略された場合、個々のメンバが別々の型を持てるようになります。
各メンバの型は、以下の順に規則が適用されて決定します:
)
$(OL
$(LI もし指定されていれば、$(I Type))
$(LI もし指定されていれば、$(I AssignExpression) の型)
$(LI もし存在すれば、直前の $(I EnumMember) の型)
$(LI $(CODE int))
)
)
------
enum { A, B, C } // 無名列挙体
------
$(P は、int型の定数 A=0, B=1, C=2 を定義します。)
$(P 列挙体には少なくとも一つのメンバが必要です。
)
$(P 各メンバの値は初期化子で指定します。
初期化子がない場合、
直前のメンバの値 + 1 となります。最初のメンバに初期化子がなかった場合は、
値は 0 となります。
)
------
enum { A, B = 5+7, C, D = 8+C, E }
------
$(P これは全てint型の A=0, B=12, C=13, D=21, E=22 となります。)
---
enum : long { A = 3, B }
---
$(P は、全てlong型の A=3, B=4 となります。)
$(V2
---
enum : string {
A = "hello",
B = "betty",
C // エラー。"betty" に 1 は足せない
}
---
---
enum {
A = 1.2f, // A は float 型の 1.2f
B, // B は float 型の 2.2f
int C = 3, // C は int 型の 3
D // D は int 型の 4
}
---
<h3>記号定数 (Manifest Constant)</h3>
$(P 無名列挙体にただ1つしかメンバがない場合、{ }
は省略できます:
)
---
enum i = 4; // i は int 型の 4
enum long l = 3; // l は long 型の 3
---
$(P このように宣言した値は左辺値ではありません。
つまり、アドレスを取ることはできません。)
)
)
Macros:
TITLE=列挙体
WIKI=Enum
CATEGORY_SPEC=$0