我遇到了以下代码 - col_8888
的数据类型是什么?为什么它引用了union _colours
?我用谷歌搜索了工会,但我找不到这种宣言的参考 - 它看起来好像col_8888
是一个“工会联盟”?
union _colours {
uint8 c[3][4];
uint32 alignment;
};
static const union _colours col_8888 =
{
{ /* B G R A in memory */
{ 0x00, 0x00, 0xFF, 0xFF, }, /* red */
{ 0x00, 0xFF, 0x00, 0xFF, }, /* green */
{ 0xFF, 0x00, 0x00, 0xFF, }, /* blue */
}
};
#define COL_8888_RED *((uint32 *)&col_8888.c[0])
#define COL_8888_GREEN *((uint32 *)&col_8888.c[1])
#define COL_8888_BLUE *((uint32 *)&col_8888.c[2])
答案 0 :(得分:9)
col_8888
的类型是union _colours
,所以它不是工会联盟:它只是一个工会。在C中,必须在联合名称前加上union
前缀才能使用它。或者,您可以使用typedef。因此,以下两个声明是等效的:
union _colours {
uint8 c[3][4];
uint32 alignment;
};
static const union _colours col_8888 =
...
/* Equivalent to: */
typedef union {
uint8 c[3][4];
uint32 alignment;
} _colours_t;
static const _colours_t col_8888 =
...
答案 1 :(得分:0)
我在SIMD类型的数学类(https://github.com/redorav/hlslpp)中使用了它。我设计的具有访问器的一种方法是使用与主类型联合的类组件。
如下所示:
class component1
{
__m128 vec;
component1(float f) { // Only write to one component }
}
class vec4
{
union
{
__m128 vec;
component1 x;
component1 y;
component1 z;
component1 w;
}
}
此示例不完整,因为component1实际上是模板化的,其行为取决于您访问的组件,但对于此示例,它很好。
如果将其扩展到矩阵,则可以为每行指向相同数据的访问器。您可以扩展它以在matrix4中使用matrix3别名。
例如,
class mat3
{
union
{
__m128 row1;
component1 m00, m01, m02;
}
union
{
__m128 row2;
component1 m10, m11, m12;
}
union
{
__m128 row3;
component1 m20, m21, m22;
}
}
class mat4
{
union
{
mat3 _m3;
union
{
__m128 row1;
component1 m00, m01, m02, m03;
}
union
{
__m128 row2;
component1 m10, m11, m12, m13;
}
union
{
__m128 row3;
component1 m20, m21, m22, m23;
}
union
{
__m128 row4;
component1 m30, m31, m32, m33;
}
}
}
有了这个想法,你就可以做到像
这样的事情mat4 m4;
m4.m00 = 3.0f;
mat3& m3 = m4._m3;
m3.m00 = 5.0f; // m4.m00 is now 5.0f