没有完全理解这部分代码

时间:2015-03-19 15:57:46

标签: c++ data-structures struct unions

我最近遇到过这段代码,我无法理解它。有人可以解释一下那里发生了什么吗?

union Color32
{
   struct ARGB
   {
      uint8_t b;
      uint8_t g;
      uint8_t r;
      uint8_t a;
   } parts;
   uint32_t argb;
   Color32() : argb(0) {}
   Color32(uint32_t c_argb) : argb(c_argb) {}
   Color32(uint8_t a, uint8_t r, uint8_t g, uint8_t b)
   {
       parts.a=a;
       parts.r=r;
       parts.g=g;
       parts.b=b;
   }
};

2 个答案:

答案 0 :(得分:4)

union共享存储的成员。这与struct形成对比,其中每个成员都分配了不同的存储空间。

此代码的效果是成员bgr& a结构共享存储ARGBargb Color32的其他成员union存储。

因此,设置argb值的构造函数会隐式设置bgr&的值。 a作为argb

位模式的有序部分

相反bgr& a构造函数构建argb

的值

这里的“ARGB”下的图表是一个非常好的图片,说明这些部分是如何“打包”成32位块的。

http://en.wikipedia.org/wiki/RGBA_color_space

我可能不需要解释b代表蓝色,g绿色,r代表红色,a代表alpha代码(AKA透明度)!

如果需要big-endian / little-endian可移植性,则可能会遇到困难。

答案 1 :(得分:0)

ARGB是一个4 uints的结构,代表绿色,蓝色,红色,我不知道。 结构是使用名称部分创建的,因此当您必须使用它时,您必须采取以下行动:parts.r = 20或parts.g = 50.

然后它创建一个对象颜色,它可以包含argb的4个参数(4 * 8 = 32)。

它用你给他的4个参数初始化了对象颜色32:a,b,c,d

Color32(uint8_t a, uint8_t r, uint8_t g, uint8_t b)
   {
   parts.a=a;
   parts.r=r;
   parts.g=g;
   parts.b=b;
   }

要恢复,您有一个名为Color of 32 bits的对象,其中包含4个来自结构部分的8位对象。