工会申报C代码

时间:2008-10-30 05:28:48

标签: c unions

我在结构中看到了一个union的声明,如下所示。示例代码如下。

我的问题是它是否有助于节省内存(使用联合的典型用途)?我没有看到好处。

typedef struct
{
    int x1;
    unsigned int x2;
    ourstruct1 ov1;
    ourstruct1 ov2;
    union
    {
            struct
            {
                mystruct1 v1;
                mystruct2 v2;
                mystruct3 v3;
                int* ctxSC;
                mystruct4 v4;
                Bool v5;
                Long v6;
                Long v7;
                Long v8;
                Long v9;
            }mystr;
    };
}structvar1;

-AD

7 个答案:

答案 0 :(得分:4)

这根本不是联盟的典型用法。联合是变体类型 - 您可以将许多不同类型的类型放入其中并检索它们。 只将一种类型放入联合中,除了奇怪的代码外,没有任何内容

答案 1 :(得分:2)

嗯。好吧,上面的例子对我来说似乎有点奇怪 - 联合的通常原因是在同一个存储中有两个不同的符号路径(按字节,按字等)。但是,您给出的示例只有一个联盟成员。

我唯一能想到的是代码的编写着眼于未来的扩展--I .E。在后续版本中,工会将有其他成员。

答案 2 :(得分:2)

添加到Philippe所写的内容:Microsoft在DirectX中使用它来定义其D3DMATRIX(以及派生结构`D3DXMATRIX),如下所示:

typedef struct _D3DMATRIX {
    union {
        struct {
            float        _11, _12, _13, _14;
            float        _21, _22, _23, _24;
            float        _31, _32, _33, _34;
            float        _41, _42, _43, _44;

        };
        float m[4][4];
    };
} D3DMATRIX;

这允许您通过名称或索引来处理矩阵元素:myMat._12myMat.m[0][1]都引用矩阵myMat的第一行中的第二个元素。它实际上只是语法糖,因为即使最脑干的编译器也会将myMat.m[0][1]之类的访问优化为常量偏移计算。

答案 3 :(得分:0)

在我看来,联盟实际上并没有在这里使用。我从来没有见过像这样的联盟内部的单独结构。奇怪。

答案 4 :(得分:0)

很难说变量和类型的混淆名称意味着使代码匿名,但编写它的人是否有可能错误地期望mystr结构中的字段是联合的?

答案 5 :(得分:0)

这段代码有效吗?不是因为工会只有一个领域(虽然这看起来很奇怪),但因为工会是匿名的;你如何告诉你想在内部结构mystr中解决的编译器?

 structvar1 var1;
 var1.mystr.ctxSC = NULL;  // compile error : structvar1 has no mystr member

GCC 3.4.4将此报告为无效的ISO C.

编辑:Steve Fallows在评论中给了我答案:这是一个专有的Microsoft扩展,允许无缝结构聚合:“包含”结构的所有字段都被视为包含结构的一部分。 / p>

答案 6 :(得分:0)

不,你不能实现利益联盟应该包含一些其他成员但不仅仅是结构。它没有任何错误,但你无法获得内存优化。