代码之家  ›  专栏  ›  技术社区  ›  ice-wind

工会的未定义行为

  •  0
  • ice-wind  · 技术社区  · 2 年前

    在处理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对我来说只是次要的 )

    1 回复  |  直到 2 年前
        1
  •  2
  •   Some programmer dude    2 年前

    C允许 type-punning 通过工会。

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

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