gpt4 book ai didi

c++ - union 结构有什么作用?

转载 作者:太空宇宙 更新时间:2023-11-04 05:05:36 25 4
gpt4 key购买 nike

我不知道如何破译这个人需要告诉我发生了什么事请帮忙

typedef struct _ARGBCOLOR {
union {
struct {
BYTE B;
BYTE G;
BYTE R;
BYTE A;
};
DWORD ARGB;
};
} ARGBCOLOR, *PARGBCOLOR;

最佳答案

如果你有一个 ARGBCOLOR x;你可以访问 4 个单独的字节作为 x.B,x.G,x.R , 和 x.A,或者一个 32 位字作为 x.ARGB

C 标准保证这些将正确覆盖(假设尺寸合适和填充要求不会搞砸狗(这里不是这种情况))。但是这个结构显然采用了小端系统。

一个额外的复杂因素是 union 是匿名的。像这样命名一个 union 是很常见的).

我最喜欢做这种叠加类型的方法是将 union 放在最外层。您可以复制 kindtype 成员,以便随处访问。但是这种方式消除了使用匿名 union (在 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;

由于通用初始前缀属性,BYTE 类型的所有三个; 成员将覆盖相同的内存。

另一种变体是为各个字节创建一个数组。

typedef union _ARGBCOLOR {
DWORD dword;
BYTE byte[ sizeof(DWORD)/sizeof(BYTE) ];
} ARGBCOLOR, *PARGBCOLOR;
enum { B,G,R,A };

现在我们不需要两个级别,并且类型双关更加明显。

ARGBCOLOR x = { 0x10203040 };
x.byte[B] = 50;
x.byte[G] = 60;
printf("0x%8x\n", x.dword); // prints: 0x10206050

关于c++ - union 结构有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17141924/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com