Next: Casting Structs, Previous: Union Constructors, Up: Structs [Contents][Index]
Sometimes a field in a struct is optional, i.e. it exists or not depending on some criteria. A good example of this is the “extended header” in a MP3 id3v2 tag. From the specification:
The second bit (bit 6) indicates whether or not the header is followed by an extended header. The extended header is described in section 3.2. A set bit indicates the presence of an extended header.
In order to express this in a Poke struct type, we could of course use an union, like:
type ID3V2_Tag = struct { ID3V2_Hdr hdr; union { ID3V2_Ext_Hdr hdr if hdr.extended_hdr_present; struct {}; } ext; … }
That’s it, we use an union with an empty alternative. However, this is a bit cumbersome. Therefore Poke provides a more convenient way to denote this:
type ID3V2_Tag = struct { ID3V2_Hdr hdr; IDV2_Ext_Hdr ext_hdr if hdr.extended_hdr_present; … }
If both a constraint and an optional field expression are specified, the second should follow the first.
For obvious reasons, optional fields are not allowed in unions.