Skip to content

Commit 83b51b3

Browse files
committed
add bitfields documentation
1 parent 1b5a753 commit 83b51b3

File tree

2 files changed

+65
-2
lines changed

2 files changed

+65
-2
lines changed

spec/declaration.dd

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,12 @@ $(GNAME DeclaratorIdentifierList):
5959
$(GNAME DeclaratorIdentifier):$(LEGACY_LNAME2 VarDeclaratorIdentifier)
6060
$(GLINK_LEX Identifier)
6161
$(GLINK_LEX Identifier) $(GLINK2 template, TemplateParameters)$(OPT) $(D =) $(GLINK Initializer)
62+
$(GLINK BitfieldDeclarator)
63+
64+
$(GNAME BitfieldDeclarator):
65+
$(D :) $(GLINK2 expression, AssignExpression)
66+
$(GLINK_LEX Identifier) $(D :) $(GLINK2 expression, ConditionalExpression)
67+
$(GLINK_LEX Identifier) $(D :) $(GLINK2 expression, ConditionalExpression) $(D =) $(GLINK Initializer)
6268

6369
$(GNAME Declarator):
6470
$(GLINK VarDeclarator)

spec/struct.dd

Lines changed: 59 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,10 @@ $(H3 $(LNAME2 struct-members, Struct Members))
114114
the implementation is free to make bit copies of the struct
115115
as convenient.)
116116

117-
$(BEST_PRACTICE
117+
$(NOTE
118118
$(OL
119-
$(LI Bit fields are supported with the
119+
$(LI Native bit fields are supported with $(RELATIVE_LINK2 bitfields, Bit Field Declarations))
120+
$(LI A library implemenation of bit fields are available with the
120121
$(LINK2 https://dlang.org/phobos/std_bitmanip.html#bitfields, bitfields) template.)
121122
))
122123

@@ -206,6 +207,62 @@ $(H2 $(LNAME2 struct_layout, Struct Layout))
206207
$(LI Avoid using empty structs as parameters or arguments to variadic functions.)
207208
))
208209

210+
$(H2 $(LNAME2 bitfields, Bit Field Declarations))
211+
212+
$(P Bit fields are available under the preview flag $(TT -preview=bitfields))
213+
214+
$(P A bit field is declared with a $(GLINK2 declaration, BitfieldDeclarator). The bit field width
215+
is specified by the $(GLINK2 expression, AssignExpression). It is evaluated at compile time, and
216+
must result in an integer expression that ranges from 0 to the number of bits in the type of the
217+
bit field.)
218+
219+
$(P The type of the bit field must be an integral type, signed or unsigned. The values assigned to
220+
bit fields must fit into the specified width. The bit field is placed into a unit of memory at least
221+
as large as needed to hold a value of the type of the bit field.)
222+
223+
$(P Anonymous bit fields do not have an $(GLINK_LEX Identifier) for them.)
224+
225+
$(P A zero width bit field must be anonymous. A zero width bit field causes the next bit field
226+
to be placed into the next unit.)
227+
228+
$(P The address of a bit field cannot be taken.
229+
$(D ref) declarations cannot be initialized from bit fields.
230+
Arrays of bit fields are not allowed.
231+
Bit fields can only be fields in structs, unions and classes.
232+
Bit fields must be non-static.
233+
)
234+
235+
---
236+
struct B
237+
{
238+
int x:3, y:2;
239+
}
240+
241+
static assert(B.sizeof == 4);
242+
243+
int vaporator(B b)
244+
{
245+
b.x = 4;
246+
b.y = 2;
247+
return b.x + b.y; // returns 6
248+
}
249+
---
250+
251+
$(IMPLEMENTATION_DEFINED Reading and writing a bit field may cause reads and writes of other bit
252+
fields in the same unit. Any use of bit fields where asynchronous access is possible will produce
253+
unreliable results.)
254+
255+
$(IMPLEMENTATION_DEFINED the layout of the bit fields is implementation defined. In practice, it is
256+
expected to be identical to that of the associated C compiler, and ImportC.)
257+
258+
$(BEST_PRACTICE
259+
If data portability is desired, use
260+
$(LINK2 https://dlang.org/phobos/std_bitmanip.html#bitfields, std.bitmanip.bitfields).
261+
If data compatibility with the associated C compiler is desired, use these bit fields.
262+
Although not guaranteed, sticking with `int` and `uint` bit fields will yield the
263+
most binary compatibility.
264+
)
265+
209266
$(H2 $(LNAME2 POD, Plain Old Data))
210267

211268
$(P A struct or union is $(I Plain Old Data) (POD) if it meets the following criteria:)

0 commit comments

Comments
 (0)