联合的未定义行为

问题描述 投票:0回答:1

在使用 3D 点时,我遇到了这种类型定义方法:

union point_3d {
    struct {
        GLdouble x, y, z;
    } coord;

    GLdouble tab[ 3 ];
};

因此,可以通过名称和下标访问坐标,例如可互换使用

p.coord.x
p.tab.[0]

这比

typedef GLdouble point_3d[3];
更有用,因为联合支持直接赋值(当然,我们可以通过名称访问坐标),而且比
struct point_3d { glDouble x, y, z; };
更有用,因为类型可以直接迭代,而无需使用
sizeof

但是,真正重要的问题是:这安全吗?这是便携式的吗?我找不到任何东西表明它不是,但我无法确认它是有保证的,所以我在这里向那些希望比我更有知识的人询问。

虽然我有兴趣知道这是否适用于 Windows,但我特别指的是 POSIX 可移植性。Windows 对我来说只是次要的

c types undefined-behavior unions memory-alignment
1个回答
0
投票

C 允许通过联合实现类型双关

这意味着您可以写入联合体的一个成员(例如结构体),并从另一个成员(数组)读取。当然还有相反的方式。

最大的可能问题是结构是否包含元素之间的填充。如果是,则它与数组不匹配。但在这种情况下不太可能。

© www.soinside.com 2019 - 2024. All rights reserved.