我有三个可能的定义,但我很困惑为什么有这么多。 访问成员的行为与其他成员的行为有什么不同吗? 优缺点都有什么?只是想知道在使用这些之前是否需要考虑一些规则。
对于
a
、r
、g
、b
、color
,我想根据数据类型访问内存中的组件,或者在同一内存中检索unsigned int
的color
位置。
struct RGBColor
{
union
{
BYTE a, r, g, b;
UINT color;
};
};
struct RGBColor2
{
union { BYTE a, r, g, b; };
union { UINT color; };
};
union RGBColor3
{
struct { BYTE a, r, g, b; };
struct { UINT color; };
};
我试图寻找一个简单的答案,但找不到任何答案。
您误解了工会的运作方式。第一个结构体包含一个具有五个替代项的联合:名为 a 的字节、名为 r 的字节,依此类推。
第二个结构体包含两个联合。第一个包含四个字节中的一个,但一次只能一个,第二个始终包含一个 uint。
第三是正当的联合。它包含四个字节的结构或包含颜色的结构。现在我不知道你的计划是什么,但是将四个字节存储到第一个替代方案中并将它们作为颜色读取是未定义的行为。更糟糕的是,这种未定义的行为在某些编译器上“有效”,但在其他编译器上却无效。或者更糟糕的是,在开发版本中而不是发布版本中。