Zig 是否支持匿名结构和数组的联合?

Does Zig support the union of anonymous structs and arrays?

这在 zig 中可行吗?如果是这样的话,像下面的 C++ 代码这样的东西在 Zig 中看起来如何?

template<class T>
class vec3
{
    union
    {
        struct{ T x,y,z; };
        T vec_array[3];
    };
};

不,Zig 不支持此类功能,而且以后也不大可能支持。最接近的是这样的:

const std = @import("std");

pub fn Vec3(comptime T: type) type {
    return extern union {
        xyz: extern struct { x: T, y: T, z: T },
        arr: [3]T,
    };
}

test {
    var v3: Vec3(u32) = .{ .arr = .{ 42, 73, 95 } };
    try std.testing.expectEqual(v3.arr[0], v3.xyz.x);
    try std.testing.expectEqual(v3.arr[1], v3.xyz.y);
    try std.testing.expectEqual(v3.arr[2], v3.xyz.z);
}

此处的 extern 限定符使容器的行为符合 C ABI(在联合的情况下,使其定义行为以访问任何成员)。

请参阅 this comment under proposal #985 以了解关于“匿名字段嵌套”为何被拒绝的相当全面的理由。