当前位置:  开发笔记 > 编程语言 > 正文

在联合中访问相同类型的非活动成员

如何解决《在联合中访问相同类型的非活动成员》经验,为你挑选了1个好方法。

我有这样的事情:

union DataXYZ
{
    struct complex_t
    {
        float real, imag;
    } complex;

    struct vector_t
    {
        float magnitude, phase;
    } vector;
};

我有一些这些的向量,是通用工作区内存,我在语义上下文后相应地使用字段.

我知道,当最后一个活动成员是另一个字段(并且键入?)时,读取联合中的字段是未定义的行为.类型和布局完全匹配时,这是否重要?

我一直在评论其他一些类似的问题,要求提供保证行为的参考资料,但还没有出现 - 因此这个问题.



1> Bathsheba..:

是的,您可以在此特定情况下阅读其他成员.

这就是C++ 11/14标准所说的:

9.5 - 工会

在并集中,至多一个非静态数据成员可以在任何时间处于活动状态,也就是说,任何时候最多一个非静态数据成员的值都可以存储在并集中.

但是,该部分之后的注释使您的特定实例合法,因为为了简化工会的使用,我们做出一项特殊保证:

[ 注意:如果标准布局联合包含多个共享公共初始序列(9.2)的标准布局结构,并且此标准布局联合类型的对象包含其中一个标准布局结构,则允许检查任何标准布局结构成员的公共初始序列; 见9.2.- 结束说明 ]

而你的struct小号做共享一个共同的初始序列:

9.2.16 - 班级成员

两个标准布局结构(第9节)类型的公共初始序列是声明顺序中非静态数据成员和位字段的最长序列,从每个结构中的第一个这样的实体开始,使得相应的实体具有布局兼容类型,并且实体都不是位字段,或者两者都是具有相同宽度的位字段.


在您引用的部分之后的注释使其合法:"[注意:为了简化联合的使用,我们做了一个特殊的保证:如果标准布局联合包含多个共享一个共同初始序列的标准布局结构(9.2) ),如果此标准布局联合类型的对象包含其中一个标准布局结构,则允许检查任何标准布局结构成员的公共初始序列;请参阅9.2 .-end note]"
推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有