我正在努力学习D(谷歌搜索这种语言是不可能的,顺便提一下。),我坚持这个问题。
考虑:
// Bitfield utilities
struct RegBit(int bitnumber, int nbits, T) {
T data;
uint mask = 46;
ubyte r = 3;
}
struct cpu_t {
// registers
union {
ushort AF = 56;
struct {
ubyte F;
ubyte A;
};
// flags
RegBit!(7, 1, ushort) fZ;
RegBit!(6, 1, ushort) fN;
RegBit!(5, 1, ushort) fH;
RegBit!(4, 1, ushort) fC;
};
然后运行它,
writefln ("%d", CPU.fC.data);
writefln ("%d", CPU.fC.r);
产生输出
56
0
我的问题是:为什么?
答案 0 :(得分:4)
初始化的联合的唯一字段是AF
,这恰好与RegBit结构的数据字段一致。其余所有内容在标准初始化期间都会被忽略,因此r
的{{1}}字段永远不会被触及(并且无论如何都会相同)
真正的问题是使用联盟,说实话,在大多数情况下你不应该需要它