假设我们有以下工会:
union Color{
int rgba;//assuming 32 bit int
struct{
unsigned char r;
unsigned char g;
unsigned char b;
unsigned char a;
}ColorComp;
};
访问union的非活动元素(例如设置rgba并尝试访问r)确实是未定义的行为(仅在c++中,而不是在c中)。 在C++中,类型或类型组合可以读/写到与其他不同类型相同的内存位置(即类型双关语),有没有任何方法来实现这种类型的行为(注意:必须由标准定义)?
编辑:删除匿名结构,并用未命名结构替换。
是的,有办法。 将字节复制到要读取字节的类型的对象上。 为此有一个标准函数:memcpy
。
示例:
struct Color{
unsigned char r;
unsigned char g;
unsigned char b;
unsigned char a;
};
static_assert(sizeof(Color) == sizeof(std::int32_t));
std::int32_t rgba = some_value;
Color c;
std::memcpy(&c, &rgba, sizeof c);