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 以了解关于“匿名字段嵌套”为何被拒绝的相当全面的理由。
这在 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 以了解关于“匿名字段嵌套”为何被拒绝的相当全面的理由。