联合结构有什么作用?

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)

lus*_*oog 7

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

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

一个额外的复杂因素是联盟是匿名的.命名这样的联合是很常见的u,但是一些编译器允许内部联合和结构是匿名的,因此它的成员被访问就好像它们在一个级别上(与联合本身处于同一级别).

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

  • Nitpick 2:匿名成员*实际上是标准化的 - 符合C11标准.尽管如此,好的综合答案.:) (2认同)