我在 C 库中找到了这个名为 handmade math 的解决方案:
typedef union hmm_vec2 {
struct { float X, Y; };
struct { float U, V; };
struct { float Left, Right; };
struct { float Width, Height; };
float Elements[2];
} hmm_vec2;
在 C 语言中,该解决方案允许您使用不同的名称引用相同的内存。 假设您有一个名为 my_vec2 的变量,您可以说 my_vec2.x、my_vec2.Height、my_vec2[0]
这样做的用途是,您不必为相同的数据结构但具有不同的字段名称定义不同的类型。
你能在 Zig 中做类似的事情吗?我尝试了一下,但没能成功。
这是我尝试过但不起作用的方法。我不明白为什么使用命名空间不能提取字段。
const vec2 = union {
usingnamespace struct { x: i32, y: i32 };
usingnamespace struct { w: i32, h: i32 };
elems: [2]i32,
};
packed union
和 packed struct
复制,但 Zig 不允许使用 packed union
或 packed struct
中的数组。
const log = @import("std").log;
const TestUnion = packed union {
coords: packed struct { x: f32, y: f32 },
size: packed struct { width: f32, height: f32 },
// elements: [2]f32, // error: packed unions cannot contain fields of type '[2]f32'
// note: type has no guaranteed in-memory representation
};
pub fn main() !void {
const test_union = TestUnion{ .coords = .{ .x = 1.2, .y = 3.4 } };
log.info("coords: {}, {}", .{ test_union.coords.x, test_union.coords.y });
log.info("size: {}, {}", .{ test_union.size.width, test_union.size.height });
}
$ zig build run
info: coords: 1.2e0, 3.4e0
info: size: 1.2e0, 3.4e0