y2k*_*y2k 0 c c++ struct unions
我不知道如何破译这个男人有人需要告诉我发生了什么事请帮忙
typedef struct _ARGBCOLOR {
union {
struct {
BYTE B;
BYTE G;
BYTE R;
BYTE A;
};
DWORD ARGB;
};
} ARGBCOLOR, *PARGBCOLOR;
Run Code Online (Sandbox Code Playgroud)
如果你有一个ARGBCOLOR x;可以访问4个独立的字节x.B,x.G,x.R,和x.A,或32位字的x.ARGB.
C标准保证这些将正确覆盖(假设尺寸适合和填充要求不会搞砸狗(这里不是这种情况)).但是这个结构显然假设了一个小端系统.
一个额外的复杂因素是联盟是匿名的.命名这样的联合是很常见的u,但是一些编译器允许内部联合和结构是匿名的,因此它的成员被访问就好像它们在一个级别上(与联合本身处于同一级别).
我最喜欢这种叠加类型的方法是将联合放在最外层.您可以复制kind或type成员,以便随处可访问.但这种方式消除了使用匿名联合(在Ansi-C或C99中不可用)的诱惑,因为你不需要u中间的虚假成员.
typedef union _ARGBCOLOR {
//BYTE type;
struct {
//BYTE type;
BYTE B;
BYTE G;
BYTE R;
BYTE A;
} bytes;
struct {
//BYTE type;
DWORD ARGB;
} word;
} ARGBCOLOR, *PARGBCOLOR;
Run Code Online (Sandbox Code Playgroud)
由于公共初始前缀属性,所有三个BYTE type;成员都将覆盖相同的内存.
另一种变化是为各个字节创建一个数组.
typedef union _ARGBCOLOR {
DWORD dword;
BYTE byte[ sizeof(DWORD)/sizeof(BYTE) ];
} ARGBCOLOR, *PARGBCOLOR;
enum { B,G,R,A };
Run Code Online (Sandbox Code Playgroud)
现在我们不需要两个级别,并且类型惩罚更明显.
ARGBCOLOR x = { 0x10203040 };
x.byte[B] = 50;
x.byte[G] = 60;
printf("0x%8x\n", x.dword); // prints: 0x10206050
Run Code Online (Sandbox Code Playgroud)